#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. Ааа — я только что перечитал свою первую строку в сообщении. Я понял. Спасибо!