Наилучшая практика: статические не финальные переменные Java - PullRequest
22 голосов
/ 08 апреля 2009

Когда в Java должны использоваться статические не финальные переменные?

Например

private static int MY_VAR = 0;

Очевидно, мы не говорим о константах здесь.

public static final int MY_CONSTANT = 1;

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

Кажется, это редко, что они должны быть использованы на практике. Что ты думаешь?

Ответы [ 7 ]

21 голосов
/ 08 апреля 2009

Сбор статистики может использовать неконечные переменные, например, посчитать количество созданных экземпляров. С другой стороны, для такой ситуации вы, вероятно, все равно захотите использовать AtomicLong и т. Д., И в этот момент она может быть окончательной. В качестве альтернативы, если вы собираете более одного показателя, вы можете получить класс Statistics и окончательную ссылку на его экземпляр.

Конечно, довольно редко иметь (оправданно) неконечные статические переменные.

6 голосов
/ 08 апреля 2009

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

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

Некоторые языки, такие как Fan, полностью запрещают изменяемую статику (или эквивалентную ей).

2 голосов
/ 09 апреля 2009

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

1 голос
/ 07 марта 2013

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

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

В настоящее время использование статических переменных для таких целей, очевидно, плохая практика , но это было не так очевидно, скажем, в 1999 году. Нет Spring, нет log4j, нет кода Clean из RCMartin и т. Д.

Язык Java сейчас довольно старый, и даже если какая-то функция сейчас сильно не рекомендуется, она часто использовалась в начале. И из-за обратной совместимости это вряд ли изменится.

0 голосов
/ 23 октября 2017

Лично для нефинальных переменных класса я использую нотацию CamelCase. Из кода ясно, что это переменная класса, так как вы должны ссылаться на нее так: FooBar.bDoNotRunTests.

В этой заметке я ставлю переменные экземпляра класса с this, чтобы отличать их от локальных переменных области видимости. ех. this.bDoNotRunTests.

0 голосов
/ 09 апреля 2009

Статическая переменная означает, что она доступна для класса в целом, поэтому оба примера доступны для класса в целом. Окончательный означает, что значение не может быть изменено. Поэтому я предполагаю, что вопрос заключается в том, когда вы хотите, чтобы значение было доступно всему классу, и оно не может быть изменено после его создания. Мое предположение будет постоянной доступной для всех экземпляров этого класса. В противном случае, если вам нужно что-то вроде счетчика населения, тогда нефинальная переменная.

0 голосов
/ 09 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...