2009-04-08 3 views
20

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

Например

private static int MY_VAR = 0; 

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

public static final int MY_CONSTANT = 1; 

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

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

ответ

21

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

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

+0

+1, но используйте Atomics. Учитывая, что это «статический», предполагается, что к нему будут доступны несколько потоков. –

6

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

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

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

+0

http://code.google.com/p/noop/ также не имеет какой-либо статистики – Eduardo

2

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

0

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

0

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

1

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

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

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

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

0

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

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

Смежные вопросы