JavaFX: где лучшее место для объявления узлов контроллера

Я создал собственный контроллер LoginFieldsController, который наследуется от класса VBox. Позже в программах я использую этот контроллер как обычный узел, такой как Button, TextFiled и т. Д. Обратите внимание, что я пишу только чистый Java-код, я не использую FXML.

Вопрос: лучше объявлять узлы LoginFieldsController как поля класса LoginFieldsController или внутри конструктора LoginFieldsController? За пределами конструктора я ничего не делал.

Другими словами, было бы лучше так:

public class LoginFieldsController extends VBox {
    private TextField loginField;
    private TextField passwordField;

    public LoginFieldsController( ... ) {
        loginField = new TextFeild("Login");
        passwordField = new TextFeild("Password"); 
        this.addAll(loginField, passwordField);
        ...
}

Или это:

public class LoginFieldsController extends VBox {

    //no fields in that class

    public LoginFieldsController( ... ) { 
        TextField loginField = new TextFeild("Login");
        TextField passwordField = new TextFeild("Password"); 

        this.addAll(loginField, passwordField);
        ...
}

2 ответа

Решение

Я настоятельно рекомендую объявлять их вне конструктора как поля. Таким образом, вы можете получить к ним доступ другими способами, когда вам нужно что-то с ними сделать. Вы можете использовать конструктор для внедрения этих полей, если вам нужно сделать это при создании экземпляра объекта, или у вас могут быть сеттеры для их внедрения позже.

Рассмотрим следующий код:

Class Example{

  public Example(...){
    TextField text1 = new TextField();
    //some other code
  }

  public boolean checkData(){
    //text1 is not visible here
  }

С другой стороны:

Class Example{

  TextField text1; 

  public Example(...){
    text1 = new TextField();
    //some other code
  }

  public boolean checkData(){
    //text1 is visible here
  }

В sidenote я бы использовал графические элементы (например, VBox в вашем примере) только для части представления (предполагаю, что вы используете MVC, так как вы используете контроллеры) и написал бы отдельный класс контроллеров.

Хорошо держать их вне конструктора, особенно если вам нужен доступ к ним позже (например, чтобы получить их текущее значение)

Другие вопросы по тегам