В моем понимании одноэлементный объект будет уничтожен только тогда, когда приложение собирается завершить работу. Поэтому в C ++ я пишу класс Singleton для регистрации моего приложения, а в деструкторе этого журнала Singleton я записываю время, когда мое приложение было закрыто. Вещи отлично работали в C ++.
Теперь я хочу иметь тот же логгер в Java, так как в Java нет деструктора, поэтому я реализовал метод finalize для этого одноэлементного логгера. Но кажется, что метод finalize никогда не вызывается.
Итак, я добавляю строку System.runFinalizersOnExit(true);
где-то в моем коде (хотя я знаю, что она устарела) и этот метод finalize вызывается каждый раз перед завершением работы приложения. Но все же есть проблема! Если я пытаюсь что-то записать в файл в этом методе финализации, он не работает, хотя System.out работает без проблем! (
Можете ли вы, ребята, помочь мне в этой проблеме? Вот пример кода того, что я пытаюсь сделать:
Класс Singleton Logger:
public class MyLogger {
FileWriter writer;
private MyLogger() {
try {
this.writer = new FileWriter("log.txt");
}
catch (IOException ex) {
}
}
public static MyLogger getInstance() {
return MyLoggerHolder.INSTANCE;
}
private static class MyLoggerHolder {
private static final MyLogger INSTANCE = new MyLogger();
}
@Override
protected void finalize () {
try {
super.finalize();
System.out.println("Here"); //worked correctly.
this.writer.write(new Date().toString()+System.getProperty("line.separator"));
this.writer.write("End");
this.writer.flush(); //does not work!
this.writer.close();
}
catch (Throwable ex) {
}
}
public synchronized void log(String str) {
try {
this.writer.write(new Date().toString()+System.getProperty("line.separator"));
this.writer.write(str+"\n");
this.writer.flush();
}
catch (IOException ex) {
}
}
}
Main:
public class Main {
public static void main(String[] args) {
System.runFinalizersOnExit(true);
MyLogger logger = MyLogger.getInstance();
logger.log("test");
}
}