Не получаю ссылку на объект из родительского класса

Всем, добрый день.

Такая проблема, у меня имеется вот такая структура

public abstract class MainController implements Initializable {

  protected Connector connector;

  @Override
    public void initialize(URL location, ResourceBundle resources) {
        connector = new Connector();
    
    }
}


public class TabPaneController<T> extends MainController {

    protected ObservableList<T> observableList;


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        super.initialize(location,resources);
        observableList = FXCollections.observableArrayList();
    }
}

public class FirstTabController extends TabPaneController<Instrument> {
   @Override
    public void initialize(URL location, ResourceBundle resources) {
        //super.initialize(location, resources);  // Если я раскомментирую эту строку то все норм
        System.out.print(connector == null);
    }
}

Проблема собственно заключается в том, что в FirstTabController я не вижу проинициилизированный объект Connector. Но, если я расскоментирую строку super.initialize(location, resources); то у меня connector создастся дважды. Не могу понять почему.

Также вопрос, правильно ли я понимаю, что в моей структуре

MainController -> TabPaneController -> FirstTabController, сначала создается FirstTabController,а MainController в последнюю очередь?

Такой вывод я сделал на основании прохода дебагером по точкам остановы.


Ответы (1 шт):

Автор решения: Barmaley Red Star

Сначала вызывается конструкторы по цепочке:

MainController -> TabPaneController -> FirstTabController

Далее инициализируются поля обозначенные @FXML потом вызывается initialize()

То есть в ходе вызова конструктора создастся поле Connector - со значением null, далее в ходе initialize() (если раскомментировать строчку super.initialize()) будет заново инициализировано поле Connector

Я бы предложил зафигачить конструктор в MainController типа:

public abstract class MainController implements Initializable {

  protected Connector connector;
  
  protected MainController() {
      this.connector = new Connector();
  }    

  @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
}

Что позволит инициализировать Connector только 1 раз.

→ Ссылка