2014-01-16 4 views
7

Я хотел бы задать вопрос, когда было бы полезно использовать статические переменные/методы или в других случаях переменные/методы экземпляра в Java?Когда использовать статические переменные/методы и когда использовать переменные/методы экземпляра в Java?

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

+3

[Click me] (http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html). – Maroun

+0

Проверьте это: [Статическое ключевое слово в java] (http://programmergate.com/static-keyword-java/) –

ответ

12

На начинающем уровне:

Используйте переменный экземпляр, когда: Каждые переменные имеют различное значение для разных объектов. Например: имя студента, номер рулона и т. Д.

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

3

static переменные часто используются для констант, что является общим для всех экземпляров, если класс. Например, многие люди не любят «жестко кодировать» константы в своем коде; они любят делать переменную public static или private static с содержательным именем и использовать их в своем коде, что должно сделать код более удобочитаемым.

В Short

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

4

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

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

Статическая функция: используется для выполнения какой-либо служебной задачи. Может быть вызван без объявления объекта.

Функция экземпляра: нужен объект для вызова этой функции.

Статический или экземпляр зависит от ваших целей.

1

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

Кроме того, использование глобалов всегда делает многоцелевой лот - еще один недостаток.

0

Что касается методов: каждый метод Foo.method (Bar1 b1, BAR2, b2) по определению всегда может иметь альтернативные эквивалентные конструкции:

Bar.altmethod (Foo F, Бар b2)

и

статический STATICMETHOD (Foo е, Бар b1, Бар b2)

И вы можете также обернуть этот последний метод как метод intsance в классе обслуживания, который сам по себе является одноплодным (так что статическая-ность методы немного спрятано кланом ss это в).

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

Представьте

класса GeographicalFigure {квадратуры Object() {...}}

Это может быть полезно, чтобы оставить открытой возможность позже добавив

класс Circle расширяет GeographicalFigure {квадратуры объекта() {throw new ThisIsNoGoodException(); }}

Кроме этого, все ваши варианты в основном эквивалентны.

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