Я не мог найти ссылки в Интернете об этом. Но просто хотелось знать, должны ли конечные поля в классе всегда быть static
или это просто соглашение. Основываясь на моем понимании их использования, я чувствую, что это более логично, чем что-то, что навязывается языком.
Должны ли конечные поля класса java всегда быть статическими?
Ответ 1
Конечно нет. Они должны быть статическими, если они принадлежат классу, а не быть статическими, если они принадлежат экземпляру класса:
public class ImmutablePerson {
private static final int MAX_LAST_NAME_LENGTH = 255; // belongs to the type
private final String firstName; // belongs to the instance
private final String lastName; // belongs to the instance
public ImmutablePerson(String firstName, String lastName) {
if (lastName.length() > MAX_LAST_NAME_LENGTH) {
throw new IllegalArgumentException("last name too large");
}
this.firstName = firstName;
this.lastName = lastName;
}
// getters omitted for brevity
}
Ответ 2
Нет, абсолютно нет - и это не конвенция.
static
и final
- совершенно разные вещи. static
означает, что поле относится к типу, а не к любому конкретному экземпляру типа. final
означает, что поле не может изменить значение после первоначального присваивания (которое должно происходить во время инициализации типа/экземпляра).
static final
поля обычно для констант, тогда как поля экземпляров, которые являются final
, обычно используются при создании неизменяемых типов.
Ответ 3
Они не всегда собираются вместе, и это не конвенция. Поля final
часто используются для создания неизменяемых типов:
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
С другой стороны, поля static
, но не final
не являются общими и довольно сложны. static final
часто встречается, потому что это означает приложение 1 -wide constant.
1 - ну, класс loader-wide, если быть точным
Ответ 4
Конечные поля не обязательно должны быть статическими, и иногда бывает полезно иметь нестационарную конечную переменную экземпляра. Поля, отмеченные как статическими, так и конечными, обычно используются для констант, например:
public static final int BORDER_WIDTH = 5;
Однако иногда вы увидите нестатическое окончательное поле, когда объект имеет неизменяемое свойство. Обычно нестатические поля final
по-прежнему отмечены private
по обычным причинам, поэтому, это больше лишней проверки, поэтому компилятор может убедиться, что вы больше никогда не устанавливаете свойство.
Ответ 5
Если вы хотите получить к ним доступ, например ClassName.FIELD
, то да, вы должны это сделать. Если вы не статируете его, вам нужно сделать что-то вроде new ClassName().FIELD
, что не нужно и бессмысленное создание объекта.
Однако, если вы используете его только в классе или делаете его private
, не делайте его статичным. Если вы находитесь в действительном классе, вы можете просто сделать FIELD
.
Чтобы полностью понять эту концепцию, вы должны знать, что означает static
. Статический означает, что он принадлежит к фактическому классу, а не к экземпляру.
Ответ 6
Абсолютно нет. Рассмотрим:
class Point {
public final int x;
public final int y;
public Point(int _x, int _y) {
x = _x;
y = _y;
}
}
Отбросьте final
, и класс станет изменяемым. Добавьте static
, и все ваши точки одинаковы, и нет законного способа записи конструктора.
Ответ 7
Абсолютно нет. Например, неизменяемые объекты имеют свойства final
, которые могут быть установлены только один раз конструктором.
Для получения дополнительной информации см. http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html
Неизменяемые объекты - это не единственный случай, когда используются свойства final
, но они являются наглядным примером их полезности.