2013-12-15 4 views
8

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

Но потом я прочитал о сборке мусора JVM несколько недель назад.

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

Но если я не сделаю это поле static, по крайней мере, это будет сбор мусора.

Таким образом, кажется, есть очень тонкая линия между созданием поля/статические методы или нет.

Может кто-нибудь, пожалуйста, объясните мне этот тонкая линия в принятии решения, так что мое приложение путь более эффективным.

+6

И в чем проблема с полем сбора мусора? Вы хотите, чтобы он был доступен на всю жизнь приложения, не так ли? Так что это нормально для объекта, не являющегося GCed. Приложения потребляют память. Это нормально и ожидаемо. Установка его в null сделает его доступным для GC (если только он не доступен из другого места). –

ответ

6

Это может быть тонкий, но есть очень четкое различие. Вы объявляете поле статическим, если оно совсем не связано с каким-либо экземпляром класса.

Простой UseCase статического поля объявления констант, используя ключевое слово final, например .:

public static final int MAX_ALLOWED = 10; 

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

+0

Также проверьте [этот ответ для получения более подробной информации о сборнике мусора статической переменной.] (Http://stackoverflow.com/a/453061/548225) – anubhava

+0

Я понимаю, что если жизнь этого поля длинная, то это нормально чтобы сделать его статическим, с другой стороны, если требуется только один экземпляр, но жизнь очень короткая. Тогда его ок, чтобы сделать его нестатичным. – Batty

+0

@Batty: Да, очень важно, а также размер статического объекта. Если это крошечный размерный объект, то его статичность не повредит вашей памяти. – anubhava

0

Поля не изготавливаются static над сборкой мусора. Это совершенно новая область для рассмотрения. Если память огромна для вашего поля static, да, вы должны сделать это non-static.

+4

Вы не должны делать его нестационарным, если размер в памяти большой, потому что тогда вы получаете более одного из них. Вместо этого вы должны сделать его статическим и иметь механизм, чтобы очистить его, когда вы его не используете. Или просто справляйтесь с этим, потому что создание нового может занять много времени. – Radiodef

+0

@ Radiodef - Это будет в пути. – fastcodejava

3

Это не обязательные правила, но лучше следовать за ними:

Когда использовать статические поля:

  1. Константы Лучшее использование статических полей являются константами, которые должны быть final слишком ,
  2. ThreadLocals В большинстве случаев вы определяете локальные переменные типа thread, иначе вы обычно теряете ссылку на них. Но не забудьте выпустить их содержимое, когда больше не будет пользы (или вы столкнетесь с утечками памяти). Большую часть времени эти переменные составляют final.
  3. И очень редкие случаи, когда вы будете ссылаться на (семантически) одноэлементный объект, к которому можно получить доступ из многих мест. (Например, ссылка на Hibernate SessionFactory в HibernateUtils).

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

Когда использовать статические методы:

  1. методы Помощник утилиты, что это обычный случай, когда метод не зависит от состояния его содержащего объект. Эти методы могут быть полезны и могут быть доступны без создания каких-либо объектов.
  2. Методы фабрики Методы фабрики - еще один хороший пример использования статических методов.
  3. Частные методы, которые не зависят от состояния объектов, когда частный метод просто не имеет зависимости от состояния объекта, гораздо лучше определить его static, чтобы получить небольшое представление.
  4. void main (String []) также должен быть статическим.
+0

Внутренние статические перечисления также приемлемы, но я думаю, что они попали под зонтик постоянной. – Franklin

+0

На самом деле это внутренние статические классы, которые совсем не плохи. –

2

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

Как вы знаете, когда статический модификатор включен в поле, для его использования не требуется экземпляр класса. И в результате он имеет то же значение для всего приложения. С одной стороны, это может привести к многочисленным ошибкам в многопоточной среде чтения/записи, если вы не правильно сериализуете доступ, с другой стороны, это хорошо, если вы пытаетесь создать singleton pattern (поле со значением, которое не изменение в течение срока службы приложения и для этого не обязательно должно быть GC)

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

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