TIJ-4 метод finalize()

248
28 апреля 2019, 10:00

Начал свое обучение Java с книжки Б.Еккеля Философия Ява. Добрался до метода finalize(). В книге приведен пример:

//: initialization/TerminationCondition.java
// Using finalize() to detect an object that
// hasn't been properly cleaned up.
class Book {
  boolean checkedOut = false;
  Book(boolean checkOut) {
    checkedOut = checkOut;
  }
  void checkIn() {
    checkedOut = false;
  }
  protected void finalize() {
    if(checkedOut)
      System.out.println("Error: checked out");
    // Normally, you'll also do this:
    // super.finalize(); // Call the base-class version
  }
}
public class TerminationCondition {
  public static void main(String[] args) {
    Book novel = new Book(true);
    // Proper cleanup:
    novel.checkIn();
    // Drop the reference, forget to clean up:
new Book(true);
    // Force garbage collection & finalization:
    System.gc();
  }
} /* Output:
Error: checked out
*///:~

И вроде бы все понятно, но вот никак не могу уразуметь, почему в методе finalize() условие if выполняется если checkedOut==true. Ведь по умолчанию boolean являются false.

Я еще лошара в коддинге, поэтому если не правильно задаю вопрос, не могли бы вы подробно описать что конкретно делает метод finalize() в данном примере.

Спасибо!

Answer 1

Да, по умолчанию checkedOut является false, но есть конструктор, который принимает значение checkedOut. Но в Book novel = new Book(true); и в new Book(true); параметр - true.
Отсюда и вытекает, что в методе finalize продолжает свою работу.
Строчка if(checkOut) подразумевает if(checkOut == true)

Answer 2

Попробовал заменить boolean на int и вот что получилось. Здесь все понятно и поддается логике. Допустим false это 1, а true любой другой int:

class FinTest {
    int a = 1; // false
    FinTest (int a1) {
        a=a1;
    }
    void finish() {
        a=1; // false
    }
    protected void finalize () {
        if(a!=1) // if (true)
            System.out.println(a+" - Error");
    }
}
public class Finalize {
    public static void main(String[] args) {
        FinTest x = new FinTest(2); // true
        x.finish();
        new FinTest(0); // true
        System.gc();
    }
}

Никаких вопросов в данном примере нет. Но объясните мне пожалуйста, в какой момент в оригинальном примере checkedOut принимает значение true и условие if(checkedOut) равносильно if(true)?

READ ALSO
List item отображает строку не полностью

List item отображает строку не полностью

У меня есть listview с информацией заполняемой пользователемМне нужно чтоб каждый item мог быть выбран

139
Строки в Java и разные конструкции

Строки в Java и разные конструкции

Чем отличается вот такая конструкция:

114
Как узнать что картинка с сервера полностью загружена

Как узнать что картинка с сервера полностью загружена

Есть способ загрузки cover-ов в новостной ленте: перебор массива с урлами и загрузка:

140