Czy są jakieś szczegóły dotyczące czyszczenia obiektu przy użyciu finalize()
, jeśli konstruktor obiektu jest wyjątkiem.Czy sfinalizowanie może zostać wywołane po tym, jak konstruktor zgłasza wyjątek?
Gdy ta metoda jest wywoływana, jest notorycznie źle zdefiniowana. Zgodnie z instrukcją:
Język programowania Java nie gwarantuje, który wątek będzie wywoływał metodę finalizacji dla dowolnego obiektu. Gwarantuje to jednak, że wątek wywołujący sfinalizowanie nie będzie blokował żadnych widocznych blokad synchronizacji użytkownika po wywołaniu finalizacji. Jeśli wyjątek nieprzechwycony zostanie odrzucony przez metodę finalizacji, wyjątek zostanie zignorowany i zakończona zostanie finalizacja tego obiektu.
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize%28%29
Nie byłem w stanie wywołać metodę sfinalizować w ten sposób. Czy ktokolwiek wie, czy to nie jest GARANTEDED lub jeśli jest w niektórych przypadkach wywoływana po tym, jak konstruktor nie zainicjował obiektu (thew wyjątek).
Pytam o to, ponieważ mam obiekt, którego nie należy czyścić dwukrotnie. Próbuję zrozumieć, czy można bezpiecznie wyczyścić przed wyrzuceniem wyjątku, czy też muszę zostawić znacznik dla finalize()
, aby skutecznie pominąć i nic nie robić.
+1 Podejrzewam, że jest to coś trzeba będzie sprawdzić, jak różne JVM może zachowywać się inaczej. –
Użycie 'finalize' jest złe. –
@Peter JLS jest dość szczegółowy, obiekt jest finalizowany, gdy konstruktor obiektu [base] zakończy się pomyślnie. –