Строковая константа против переменной в методе Java

#java #variables #constants #code-readability

#java #переменные #константы #удобочитаемость кода

Вопрос:

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

Последнее, однако, применимо не ко всем случаям неизменяемых значений: существует следующий метод, который вызывается только один раз, при инициализации приложения, которое дважды использует одно и то же значение строки. На строку ссылаются и она используется только внутри метода.

Мой вопрос: каков наилучший способ определения переменной / константы? Поскольку в большом приложении это простая строка, производительностью и памятью можно пренебречь, это больше касается удобочитаемости и обслуживания.

Является ли она переменной внутри метода:

 protected void init() {
    final String thestring = "thevalue";

    methodA(thestring);
    methodB(thestring);
}
  

или она является постоянной на уровне класса (хотя используется только в методе):

 private static final String THESTRING = "thevalue";

protected void init() {

    methodA(THESTRING);
    methodB(THESTRING);
}
  

или третье, лучшее решение? Пожалуйста, также примите во внимание, что в одном классе может быть больше похожих методов.

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

1. для удобства обслуживания лучше сохранить значение в файле конфигурации / свойств.

2. Почему бы не определить новую ENUM с помощью этой строки и не использовать ее?

3. Вопрос «Что лучше?» в подобных ситуациях очень важен для наблюдателя. Во многих случаях вам следует просто использовать литеральную строку, встроенную в ваш код, и не определять «переменную» для ее хранения. В других случаях то, что вы делаете, довольно хорошо определяется проблемами перевода. И если переменную нужно легко изменить (например, это URL или что-то подобное), то размещение ее вверху упрощает поиск, даже если она используется только в одном месте.

Ответ №1:

Для меня лучшим решением является использование переменной внутри метода — потому что это внутренняя переменная. Поэтому другие методы не должны это видеть. Учитывайте инкапсуляцию и чистый код, при попытке переместить эту переменную на уровень класса вы получите длинный список переменных класса.

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

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

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

2. Но PI является общедоступной переменной, используемой многими другими. В приведенном выше примере эти переменные будут использоваться только в одном методе.

3. Я думаю, ответ @ kajax устраняет ваши сомнения… Сохранение этого значения на уровне класса уменьшает как расширяемость, так и читаемость.

4. На мой взгляд, в данном случае «расширяемость и удобочитаемость» не является аргументом and. Это все еще конечная переменная, используемая внутренне для одного метода. Читаемость такая же, в данном случае расширяемость превосходит программирование.

Ответ №2:

Я могу придумать три места для размещения вашей переменной (все окончательные ofc), у каждого есть свои преимущества и недостатки.

  1. Локальная переменная.
  2. Частное статическое поле внутри вашего класса.
  3. Общедоступное статическое поле внутри некоторого Properties класса.

1 — Преимущества: переменная может быть видна только внутри вашего метода — высокая безопасность кода. Недостатки: переменная скрыта внутри метода, ее может быть трудно найти и изменить.

(Я пропущу 2, потому что это просто компромисс между 1 и 3)

3 — Преимущества: ваше поле находится среди других настраиваемых полей, что упрощает изменение ваших настроек. Недостатки: поле является общедоступным, и каждый может его видеть (но String является неизменяемым, поэтому никто не сможет его изменить).

Резюме: зависит от того, насколько вы ожидаете, что вам нужно будет изменить вашу переменную (например, балансировку, изменение цвета, …). Если вы уверены, что это строковое значение является правильным, я бы не побоялся поместить это в локальную переменную.

Ответ №3:

Обычно константы не зависят от конкретного экземпляра. Таким образом, лучше хранить константы как статические переменные, а не как переменные-члены. Преимущества заключаются в:

  • Для каждого объекта выделяется только одно значение переменной вместо одного.
  • Вам не нужно создавать переменную экземпляра для доступа к константе, например, PI объявлен статическим в классе Java Math.

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

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