Почему мы объявляем константы, и нужно ли их статично?

77
6

Я знаю, что константы - это те переменные, значения которых не могут быть изменены, но если какая-либо часть программы не изменит их значение, они все еще должны быть объявлены final? И также кажется, что они должны быть статическими. Почему это?

спросил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
1
Решение
98

Вы на самом деле задаете сразу несколько вопросов, на которые я пытаюсь ответить.

Зачем использовать константы?

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

final ключевое слово.

Его цель (по крайней мере в этом контексте) двоякая. Один из них - сделать невозможным для программиста изменить значение. Возможно, вы забыли, что это постоянная. Другой - сообщить компилятору, что значение не может измениться во время выполнения. Это можно использовать для создания оптимизированного байт-кода (например, константа может быть удалена, а каждое замещение заменено ее значением компилятором).

static ключевое слово.

В Java все это класс. И каждый класс может иметь несколько экземпляров (объектов). Если вы не отмечаете свою константу как static то каждый объект имеет "свою собственную константу". Так как вы не хотите, чтобы было разумно пометить его как статичное. Статические поля (или методы) существуют только один раз для каждого класса (в отличие от одного объекта на объект класса).

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
99

Конечно, можно объявить нестатические финалы:

class Employee {
final String empId;

public Employee(String empId) { this.empId = empId; }
}

В других случаях вы хотите, чтобы поле было постоянным во всех экземплярах класса:


class Color {
final static int BLACK = 0xFFFFFF;
}

Что касается того, почему вы хотите объявить их final вообще, а не просто не изменять их когда-либо,

    Это повышает читаемость программы, сообщает читателю о чем-то о его поведении, которое в противном случае должно было быть в документации Компилятор напоминает, если вы попытаетесь изменить его по ошибке

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
88

Обычно, когда вы собираетесь использовать постоянное значение для своего кода, вы объявляете конечную статическую переменную. Это мешает вам распространять " магические значения " вокруг кода, что не является хорошей практикой для соображений удобства и разборчивости.

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

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

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
88

Поскольку static относится к классу, а не к любому экземпляру.

Если для всех экземпляров используется static отдельная копия. Где в качестве instance имеет отдельную копию.

считайте, что вам нужно увеличить/уменьшить игровой счет (count) на каждом этапе (класс Stage) вашей игры.

enter image description here

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
76

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

Представьте, что ваш код определяет, что в вашем окне будет отображаться 15 записей, и вы будете рассматривать людей как взрослых, когда им исполнится 15 лет. Без констант изменение размера окон означает, что вам нужно будет найти 15 случаев, не пропустите ни одного, и не изменяйте 15 что означает возраст по ошибке.

static часть состоит в том, что вы не хотите создавать экземпляр объекта для получения данных, которые не связаны с конкретным экземпляром (это именно то, что static средства, кстати, не только при использовании для констант).

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
77

Это не обязательно, но рекомендуется по соображениям эффективности памяти:

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

ответил(а) 2021-01-25T23:47:56+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема