У меня есть проект Java 11, включающий несколько классов. В данном сценарии 2 моих класса — A и B — реализуют метод java finalize(), который теперь устарел навсегда. Я понимаю, что этот метод может быть удален в ближайшем будущем, но я думаю, что лучше сразу найти замену финализации.
finalize() в классе A в основном сосредоточен на уничтожении объекта длинного типа, который является защищенной переменной-членом, и на выводе определенных сообщений в журнал. finalize() в классе B просто печатает определенные сообщения в журнал.
Экземпляры класса A создаются из нескольких других классов, а класс B расширяет другой класс ClassLoader. (Фрагменты кода включены ниже.)
Я рассмотрел довольно много предложений, таких как,
- Автозакрытие с помощью try-with-resources
- Очищаемый интерфейс ( https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/ )
- попробуй-поймай-наконец-то
Во-первых, они объясняются не так хорошо, и даже когда они объясняются, примеры относятся к проектам одного класса с основным методом, присутствующим в том же классе. Я не могу двигаться вперед с минимальным решением, которое я нашел в Интернете.
Опубликуйте мое исследование. Autocloseable с использованием try-with-resources кажется моим лучшим вариантом. Я понимаю, что мои классы A и B должны реализовывать Autocloseable, в то время как вызываемые (здесь немного не уверен) должны использовать попытку с ресурсами.
Я буду признателен за любую помощь в упрощении этой проблемы, даже если это заполнение пробелов, которые могут присутствовать в моем понимании сценария.
А.ява
class A
{
protected long a_var;
protected A(String stmt, boolean isd)
{
// a_var is initialized here
}
public void finalize()
{
if(a_var != 0)
{
log("CALL destroy !");
destroy(a_var);
log("DONE destroy !");
}
}
}
Б.ява
public class B extends extends ClassLoader
{
protected void finalize ()
{
log("No action");
}
}
B.finalize()
уже ничего не делает, кроме самого лога, и вы вряд ли пропустите посторонние сообщения лога: и он уже недействителен, так как должен вызыватьsuper.finalize()
в своем (отсутствующем)finally
блоке; так что вы можете просто удалить его со 100% невозмутимостью. Но еслиC.finalize()
существует, то теперь он будет вызываться для экземпляровB
, что может оказаться интересным.A.finalize()
звонитA.destroy()
, которого вы не указали, поэтому комментировать дальше невозможно. - person user207421   schedule 18.09.2019B
расширенный классC
в исходном вопросе, согласно моему комментарию. Но посколькуjava.lang.ClassLoader
не реализуетfinalize()
, вам вообще не нужно беспокоиться об удаленииB.finalize()
, как я уже говорил. - person user207421   schedule 18.09.2019java.lang.ref.Cleaner
(или лежащая в его основе технологияPhantomReference
) — это еще один способ заменитьfinalize()
и, вероятно, самая простая замена. - person Joachim Sauer   schedule 18.09.2019