2015-03-17 3 views
1

Я прочитал несколько замечаний разработчиков на других потоках, касающееся использования статических переменный:Что лучше всего использовать статический в Java

  1. Это стоит памяти: Есть ли способ, чтобы освободить память, занимаемый статическими переменными, когда мы выходим из класса, где они были определены/созданы?
  2. В чем разница между использованием статических переменных в отношении статических конечных переменных с точки зрения управления памятью, если вы не смогли избежать его использования.

Я понимаю, что использование статики противоречит концепциям OOPS, управление памятью плохое, нарушая концепцию инкапсуляции. Если я использую 5-6 статических переменных, воздействие будет настолько большим, что я буквально должен прекратить его использовать. Или может быть кто-то из вас, ребята, могут предложить мне фактическое использование статического в Java объектно-ориентированного языка программирования?

+4

Что вы подразумеваете под «выходом из класса»? Если вы имеете в виду, когда один метод заканчивается, нет, что, конечно же, не освободит память. Если вам нужна только переменная на протяжении всего метода, она должна быть локальной переменной ... но вы должны беспокоиться о дизайне, а не об использовании памяти, IMO. Покажите нам код, о котором вы беспокоитесь ... –

+1

Не бросайте ребенка с водой для ванны. Static использует его, но я думаю, что самый большой аргумент против ** over ** - использования - это не проблемы с памятью, а потеря преимуществ ООП, рискуя увеличить циклическую сложность. Но, сказав это, я голосую, чтобы закрыть вопрос как мнение, основанное на том, что оно просто вызовет долгую дискуссию. –

+0

вы можете визуализировать статические переменные как ** глобальные переменные **. Они не соответствуют ни одному объекту, а классу в целом. – Batty

ответ

1

Это стоит памяти: есть ли способ освободить память, занятую статическими переменными , когда мы выходим из класса, где они были определены/созданы?

Ok. Точка 1 -> Все переменные независимо от того, из статические или другие занимают память. Итак, это стоит памяти. не совсем точный.

Далее, разница между статическими и экземпляром переменными заключается в том, когда они становятся недостижимо (готовы к GC). экземпляры экземпляра экземпляра становятся недоступными, когда вы выходите из сферы действия, но с экземплярами, указанными статическими ссылками, они достижимы, если явно не установлено значение null.

Так,

static Object o = new Object(); 
o=null ; 

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

Преодоление концепции инкапсуляции.

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

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

Опять же, это сводится к точке 1. Static является выбором дизайна, а не выборреализации. По-моему, используйте статический как упущенный вариант.

0

Это спорный вопрос.

В идеале вы хотите, чтобы статические вещи были общими для всех экземпляров, то есть они связаны с понятием класса, а не с единственным экземпляром (например, Integer.parseInt()).

Статические конечные переменные/константный вид относятся к нему, например, для значений по умолчанию (Dog.defaultNumberOfLegs = 4).

Статические изменчивые вещи сложнее, и они являются imho, хакерским сокращением за то, что они имеют общее состояние. Хорошо для быстрого экспериментирования, но довольно плохо для того, чтобы сохранить в своем производственном коде, поскольку статические вещи испытывают трудности с тестированием из-за растущей трудности в издевательстве. Если вы хотите, чтобы все было уникальным, вы должны сделать синглтон из него, как только перейдете к реальному производственному коду.

Это в сторону, 5 или 6 переменных не должно быть слишком много проблем с памятью. Это больше связано с элегантностью/гарантией/проверкой. Это относится ко всем «нормальным» случаям. Если вы действительно вкладываете себя в это, вы можете создать цепочку ссылок с помощью одной статической переменной, которая будет засорять вашу память, но это не реалистичный сценарий.

+0

'' Это дискуссионный '' - поэтому вопрос в целом должен быть закрыт и удален. –

+0

Вопрос на самом деле несколько вопросов. Первая часть дискуссионная, часть, где он спрашивает: «Будет ли 5 ​​или 6 статичных слишком много забивать память?» это, имхо, не-спорно «нет». –

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