Подтвердить что ты не робот

Лучшая практика: статические нестатистические переменные Java

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

Например

private static int MY_VAR = 0;

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

public static final int MY_CONSTANT = 1;

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

Похоже, что они редко используются на практике. Как вы думаете?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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