Дополнительно
Java: когда следует использовать статические методы
Меня интересует, когда следует использовать статические методы? Скажем, если у меня есть класс с несколькими геттерами и сеттерами, одним или двумя методами, и я хочу, чтобы эти методы вызывались только у объекта экземпляра класса. Значит ли это, что я должен использовать статический метод?
Например
Obj x = new Obj();
x.someMethod
или
Obj.someMethod
(это статический способ?)
Я'совсем запутался!
863
20
Одно правило: спросите себя: «Имеет ли смысл называть этот метод, даже если Обдж еще не построен?«Если это так, это определенно должно быть статично.
Таким образом, в классе «Car» у вас может быть метод «двойной конвертированиеMpgToKpl (двойная mpg)», который будет статичным, потому что можно узнать, к чему преобразуется 35 миль на галлон, даже если никто никогда не создавал автомобиль. Но «void setMileage (двойная миль на галлон)» (который устанавливает эффективность одного конкретного автомобиля) не может быть статичным, поскольку немыслимо вызывать метод до того, как будет построен какой-либо автомобиль.
(Кстати, обратное не всегда верно: у вас иногда может быть метод, который включает в себя два объекта «Автомобиль», и все же вы хотите, чтобы он был статичным. Например.
Car theMoreEfficientOf (Автомобиль c1, Автомобиль c2)
. Хотя это может быть преобразовано в нестатическую версию, некоторые утверждают, что, поскольку не существует «привилегированного» выбора, какой автомобиль важнее, вам не следует заставлять вызывающего абонента выбирать один автомобиль в качестве объекта, который вы будете вызвать метод на. Эта ситуация составляет довольно небольшую долю всех статических методов.)Определите статические методы только в следующих сценариях:
Есть несколько веских причин использовать статические методы:
Производительность : если вы хотите запустить какой-то код и не хотите создавать для этого дополнительный объект, вставьте его в статический метод. JVM также может много оптимизировать статические методы (я думаю, что однажды я прочитал Джеймса Гослинга, заявляющего, что вам не нужны пользовательские инструкции в JVM, поскольку статические методы будут такими же быстрыми, но не смогут найти источник - таким образом это может быть полностью ложным). Да, это микрооптимизация, и, вероятно, она не нужна. И мы, программисты, никогда не делаем ненужных вещей только потому, что они крутые, верно?
Практичность : вместо вызова
new Util () .method (arg)
, вызовUtil.method (arg)
илиmethod (arg)
со статическим импортом. Проще, короче.Методы добавления : вы действительно хотели, чтобы класс String имел
removeSpecialChars(
метод экземпляра, но это 'там нет (и это должно 'т, с вашего проекта 'Специальные символы могут отличаться от других проектов 's) и вы можете 'добавь это (так как Java несколько вменяемая) так что вы создаете класс полезности, и позвонитеremoveSpecialChars(s)
вместоs.removeSpecialChars(
. Сладкий.Чистота : принимая некоторые меры предосторожности, ваш статический метод будет чистой функцией, то есть единственное, от чего он зависит, это его параметры. Данные в, данные вне. Это легче читать и отлаживать, так как вам не о чем беспокоиться о наследстве. Вы также можете сделать это с помощью методов экземпляра, но компилятор поможет вам немного больше со статическими методами (не позволяя ссылаться на атрибуты экземпляра, переопределяющие методы и т. Д.).).
Вам также придется создать статический метод, если вы хотите сделать синглтон, но... не. Я имею в виду, подумай дважды.
Теперь, что более важно, почему вы не хотите создавать статический метод? В основном полиморфизм выходит из окна . Вы не сможете переопределить метод, < strike > и объявить его в интерфейсе < / strike > (до Java 8) . Это требует большой гибкости от вашего дизайна. Кроме того, если вам нужно state , вы получите много ошибок в валюте и / или узких мест, если вы не будете осторожны.
Прочитав статьи Миско, я считаю, что статические методы плохи с точки зрения тестирования. Вместо этого у вас должны быть фабрики (возможно, с помощью инструмента для инъекций зависимостей, такого как рука).
как мне гарантировать, что у меня есть только один из чего-то
Основная проблема статических методов заключается в том, что они являются процедурным кодексом
Метод
static
- это метод одного типа, который не нуждается в инициализации какого-либо объекта для его вызова. Вы заметили, чтоstatic
используется в функцииmain
в Java? Выполнение программы начинается оттуда без создания объекта.Рассмотрим следующий пример:
Статические методы в java принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают на вход параметры, выполняют над ними действия, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.
Если вы применяете статическое ключевое слово с любым методом, оно называется статическим методом.
// Программа изменения общего свойства всех объектов (статическое поле).
O / P: 111 индийских BBDIT 222 американский BBDIT 333 Китай ББДИТ
Нет, статические методы не связаны с экземпляром, они принадлежат классу. Статические методы - это ваш второй пример, а методы экземпляра - первый.
Статические методы не связаны с экземпляром, поэтому они не могут получить доступ к нестатическим полям в классе.
Вы бы использовали статический метод, если метод не использует какие-либо поля (или только статические поля) класса.
Если используются какие-либо нестатические поля класса, вы должны использовать нестатический метод.
Статические методы должны быть вызваны на класс, методы экземпляра должны быть вызваны на экземпляры класса. Но что это значит на самом деле? Вот полезный пример:
У автомобильного класса может быть метод экземпляра, называемый Accelerate (). Вы можете ускорить работу автомобиля, только если автомобиль действительно существует (был сконструирован), и поэтому это будет метод экземпляра.
В автомобильном классе также может быть метод подсчета GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если бы не было построено ни одного автомобиля, этот метод вернул бы 0, но он все еще должен быть в состоянии быть вызванным, и, следовательно, он должен быть статическим методом.
На самом деле, мы используем статические свойства и методы в классе, когда мы хотим использовать какую-то часть нашей программы, которая должна существовать там до тех пор, пока наша программа не будет запущена. И мы знаем, что для манипулирования статическими свойствами нам нужны статические методы, поскольку они не являются частью переменной экземпляра. А без статических методов манипулирование статическими свойствами занимает много времени.
Используйте статический метод, если вы хотите иметь возможность доступа к методу без экземпляра класса.
Статические методы не нужно вызывать на объекте, и именно тогда вы используете его. Пример: ваш Main () является статичным, и вы не создаете объект для его вызова.
Статические методы и переменные являются контролируемой версией «глобальных» функций и переменных в Java. В каких методах можно получить доступ как
classname.methodName ()
илиclassInstanceName.methodName ()
, т.е. статические методы и переменные могут быть доступны с использованием имени класса, а также экземпляров класса.Класс не может быть объявлен статическим (потому что это не имеет смысла. если класс объявлен общедоступным, к нему можно получить доступ из любого места), внутренние классы могут быть объявлены статическими.
Статические методы - это методы на Java, которые можно вызывать без создания объекта класса. Это принадлежит классу.
Мы используем статический метод, когда нам не нужно вызывать метод с использованием экземпляра.
Статический:
Obj.someMethod
Используйте
static
, когда вы хотите предоставить доступ к методу на уровне класса, т.е. где метод должен быть вызываемым без экземпляра класса.Статические методы могут быть использованы, если
ПРИМЕЧАНИЕ: Мало кто спорит против тестируемости статических методов, но статические методы также могут быть проверены! С jMockit можно издеваться над статическими методами. проверяемость . Пример ниже:
Обычное использование методов
static
- доступ к полямstatic
.Но вы можете иметь «статические» методы, не ссылаясь на «статические» переменные. Методы помощи без ссылки на переменную
static
можно найти в некоторых классах Java, таких как [java.lang.Math][1]Другой вариант использования, я могу думать об этих методах в сочетании с методом
синхронизированного
, - это реализация блокировки уровня класса в многопоточной среде.Если вам нужен метод доступа к объекту экземпляра класса, ваш метод должен быть нестатическим.
Документация Oracle страница содержит более подробную информацию.
Не все комбинации переменных и методов экземпляра и класса разрешены:
[1]: http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Math.java/?v = источник
Статический метод имеет две основные цели:
В затмении вы можете включить предупреждение, которое поможет вам обнаружить потенциальные статические методы. (Над выделенной линией есть еще одна, которую я забыл выделить)