Я не мог найти ни одной ссылки в Интернете по этому поводу. Но просто хотелось знать, должны ли конечные поля в классе всегда быть static
или это просто соглашение. Основываясь на моем понимании их использования, я чувствую, что это более логичная вещь, чем то, что навязывается языком.Должны ли конечные поля класса java всегда быть статическими?
ответ
Конечно нет. Они должны быть статическими, если они принадлежат к классу, а не быть статическим, если они принадлежат к экземпляру класса:
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
}
Если вы хотите получить к ним доступ, как ClassName.FIELD
, то да, вы должны это сделать. Если вы не станете им статичным, вы должны сделать что-то вроде new ClassName().FIELD
, что необязательно и бессмысленное создание объекта.
Однако, если вы используете его только в классе или делаете его private
, то не делайте его статичным. Если вы находитесь в самом классе, вы можете просто сделать FIELD
.
Чтобы полностью понять эту концепцию, вы должны знать, что означает static
. Статический означает, что он принадлежит к фактическому классу, а не к экземпляру.
Абсолютно нет. Неизменяемые объекты, например, имеют свойства final
, которые могут быть установлены только один раз конструктором.
Для получения дополнительной информации, пожалуйста, см: http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html
Неизменные объекты не единственный случай, в котором используются final
свойства, но они дают наглядный пример их полезности.
Они не всегда собираются вместе, и это не конвенция. 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
часто виден, потому что это означает приложение -constant.
1 - хорошо, загрузчик классов шириной, чтобы быть точным
Нет, совсем нет, - и это не условность.
static
и final
полностью разные вещи. static
означает, что поле относится к типа, а не к любому конкретному экземпляру типа. final
означает, что поле не может изменить значение после первоначального присвоения (которое должно происходить во время инициализации типа/экземпляра).
static final
полей, как правило, для констант - тогда например полей, которые final
обычно используются при создании неизменных типов.
Конечные поля не нужно быть статическим, а иногда это может быть полезно имеют нестационарную конечную переменную экземпляра.Поля, которые отмечены как статические, так и последними, как правило, используются для констант, например:
public static final int BORDER_WIDTH = 5;
Однако, иногда вы будете видеть нестатическое последнее поле, когда объект имеет неизменяемое свойство. Обычно нестатические поля final
по-прежнему отмечены private
, так что это скорее дополнительная проверка, поэтому компилятор может убедиться, что вы никогда не устанавливаете свойство снова.
Абсолютно нет. Рассмотрим:
class Point {
public final int x;
public final int y;
public Point(int _x, int _y) {
x = _x;
y = _y;
}
}
Отбросьте final
, а класс становится изменчивым. Добавьте static
, и все ваши точки совпадают, и нет законного способа записи конструктора.
Ответ отрицательный.
статическая
-
«Указывает, что только одно такое поле данных доступно для всех экземпляров этого класса. Без этого модификатора, каждый экземпляр имеет свой собственную копию поля данных»
... это означает, что может быть только один из этой
окончательный
-
"Значение, указанное в поле данных не может быть изменен"
... что означает, что это постоянная
- 1. Почему Java ThreadLocal переменные должны быть статическими
- 2. Не должны ли статические шаблоны быть статическими?
- 3. Должны ли данные контексты быть статическими?
- 4. Должны ли таблицы поиска быть статическими
- 5. Должны ли все методы JNI быть статическими?
- 6. Должны ли предикаты весенней спецификации быть статическими?
- 7. java singleton pattern, должны ли все переменные быть переменными класса?
- 8. Андроидные фрагменты должны быть статическими
- 9. Должны ли поля класса Java всегда быть окончательными? Это хорошая оценка?
- 10. В MSpec, почему все поля под тестом должны быть статическими?
- 11. Должны ли GTK «обратные вызовы» быть статическими функциями?
- 12. Почему .Net WPF DependencyProperties должны быть статическими членами класса
- 13. Последствия «Журналы должны быть приватными статическими»
- 14. Почему эти переменные должны быть статическими?
- 15. Должны ли все объекты класса быть ссылкой?
- 16. Должны ли быть сделаны защитные копии ВСЕГДА?
- 17. Должны ли конструкторы всегда быть публичными?
- 18. Должны ли структуры всегда быть неизменными?
- 19. MVC: Эти модели должны быть статическими?
- 20. Почему переменные в классе должны быть статическими?
- 21. Должны ли жестко заданные данные в функции быть статическими?
- 22. Должны ли методы C#, которые * могут быть статическими, статичны?
- 23. Возможно ли синхронизировать конечные поля в java?
- 24. Конечные поля и безопасность потоков
- 25. Должны ли все поля в классе моделирования GlobalSettings быть статическими (C# в центре)?
- 26. Изменение конечные поля в Java
- 27. Как Java обрабатывает конечные поля по экземплярам?
- 28. Java - конечные переменные
- 29. Почему переменные, которые я получаю, должны быть статическими?
- 30. Имена методов всегда должны быть глаголом?
Это не только дополнительную проверку. Заключительные поля предоставляют дополнительные гарантии безопасности потоков. –