@Kolos90

Почему подобная инициализация обьекта по утверждению автора книги считается корректной?

В книге "Философия Java" Брюса Эккеля утверждается следующее:
Из результата программы видно (код ниже) что ссылка w3 минует двойную инициализацию, перед вызовом конструктора и во время него. (Первый объект теряется, и со временеи его уничтожит сборщик мусора.) Поначалу это может показаться неэффективным, но такой подход гарантирует верную инициализацию - что произошло бы, если бы в классе был определен перегруженный конструктор, который не инициализировал бы ссылку w3, а она при этом не получала бы значения по умолчанию?
//: initialization/OrderOfInitialization.java
// Demonstrates initialization order.
import static net.mindview.util.Print.*;

// When the constructor is called to create a
// Window object, you'll see a message:
class Window {
  Window(int marker) { print("Window(" + marker + ")"); }
}

class House {
  Window w1 = new Window(1); // Before constructor
  Window w2 = new Window(2); // After constructor
  Window w3 = new Window(3); // At end 

  House() {
    // Show that we're in the constructor:
    print("House()");
    w3 = new Window(33); // Reinitialize w3
  }

  void f() { print("f()"); }

}

public class OrderOfInitialization {
  public static void main(String[] args) {
    House h = new House();
    h.f(); // Shows that construction is done
  }
} /* Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*///:~
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
class House {
  House(int i) {
    print("House(int)");
  }
  Window w3; // Not Init!
  House() {
    // Show that we're in the constructor:
    print("House()");
    w3 = new Window(33); // initialize w3
  }
  Window w2 = new Window(2); // After constructor
  void f() { print("f()"); }
  Window w1 = new Window(3); // At end 
}

Теперь у вас 2 констуктора. И в зависимости от того, какой вызвать, w3 будет инициализирована или нет.
А в вашем коде w3 будет инициализирована в любом случае, если явно в констркуторе ссылку не занулить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@private_tm
JAVA dev
Смотрите предположим есть класс объект которого можно создать только с каким то начальным значением.

Вот для этого иногда и отсутствует конструктор по умолчанию.
Я думаю это имелось тут виду.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы