использование атрибута класса, который был инициализирован в конструкторе

#java

#java

Вопрос:

Если я задаю значение атрибута класса и использую final, должен ли я инициализировать атрибут в качестве параметра конструктора класса? Например, я установил для атрибута rack of length значение 60

 public class Runs {
    Teams team;
    final int racklength=60;
    int xposteam;

     public Runs (Teams y) {
         team=y;           
     }
}
  

Комментарии:

1. Вы можете отформатировать свой код, сделав отступ в блоке кода на 4 пробела (или выберите раздел кода и нажмите кнопку {} в редакторе). Я сделал это для вас, но вы, возможно, захотите отредактировать вопрос и попытаться немного исправить форматирование.

Ответ №1:

final поля должны быть либо инициализированы встроенно, либо в конструкторе.

Пример:

 class Foo {
    final String bar = "bar";
    Foo() {
    }
}
  

или

 class Foo {
    final String bar;
    Foo() {
        bar = "bar";
    }
}
  

допустимо.

Ответ №2:

Вы всегда должны инициализировать final атрибут, но вы можете сделать это либо на месте (где вы его впервые объявляете), либо в его конструкторе (или конструкторах):

 public class Runs {
    Teams team;
    final int racklength; // initialization postponed
    int xposteam;

     // constructor defaulting racklength to 60
     public Runs (Teams y){
         team=y;
         racklength=60;
    }

     // constructor with variable initialization of final attribute
     public Runs (int l, Teams y){
         team=y;
         racklength=l;
    }

     // error since racklength is not initialized during construction
     public Runs (){
         team=null
    }
}
  

Ответ №3:

Нет, вы можете инициализировать его там, где вы объявили переменную. И нет никаких причин, по которым вы должны присваивать переменную с параметром конструктору.

Комментарии:

1. «И нет никаких причин, по которым вы должны присваивать переменную с параметром конструктору». — Возможно, я вас неправильно понял, но … э-э? Если вы определяете константу уровня экземпляра (которой на самом деле является нестатический финал), вы можете инициализировать ее с помощью параметра конструктора. В противном случае, если все экземпляры класса должны иметь одинаковое значение для своих констант уровня экземпляра, мы могли бы также сделать константу статической.

2. Я согласен. Ваша точка зрения не является взаимоисключающей с тем, что я сказал.

Ответ №4:

Нет, вам не обязательно это делать.

Оба они работают нормально.

 public final class SomeClazz {
    private final int test=10;
    public SomeClazz(){

    }
    public int getTest() {
        return test;
    }

}
  

Или

 public final class SomeClazz {
    private final int test;
    public SomeClazz(int test){
        this.test = test;
    }
    public int getTest() {
        return test;
    }

}
  

Однако я предпочитаю инициализировать их с помощью конструктора, потому что таким образом вызывающий, который создает объект, знает, как создать состояние объекта с предполагаемыми значениями. Если предполагается, что это значение постоянного типа, тогда вам следует использовать Enums , а не определять их в своем классе таким образом.

Комментарии:

1. Для этого вам не нужен геттер.

2. @Джереми Хайлер — правильно. Я имел в виду объявить test как private не используемый по умолчанию package private . Я обновил свой пост.

3. Вы полностью упустили мою мысль. Абсолютно нет необходимости объявлять средство получения, чтобы сделать переменную класса / экземпляра окончательной.

4. Ааа — я только что перечитал свою первую строку в сообщении. Я понял. Спасибо!