Одно эмпирическое правило: спросите себя: «Есть ли смысл вызывать этот метод, даже если объект еще не был построен?» Если это так, то он обязательно должен быть статичным.
Так что в классе у Car
вас может быть метод:
double convertMpgToKpl(double mpg)
... что было бы статично, потому что кто-то может захотеть узнать, во что конвертируется 35 миль на галлон, даже если никто никогда не создавал Car
. Но этот метод (который устанавливает эффективность одного конкретного Car
):
void setMileage(double mpg)
... не может быть статичным, поскольку невозможно вызвать метод до того, как какой-либо объект был создан Car
.
(Между прочим, обратное не всегда верно: иногда вы можете иметь метод, который включает два Car
объекта, и все же хотите, чтобы он был статическим. Например:
Car theMoreEfficientOf( Car c1, Car c2 )
Хотя это может быть преобразовано в нестатическую версию, некоторые утверждают, что, поскольку нет «привилегированного» выбора, который Car
более важен, вы не должны заставлять вызывающего абонента выбирать его Car
в качестве объекта, который вы вызываете. метод на. Эта ситуация объясняет довольно небольшую долю всех статических методов.)
Car#isMoreEfficientThan(Car)
. Преимущество в том, что автомобиль, который вы возвращаете в галстуке, не является произвольным. По названию метода очевидно, что возвращается в связи.Определите статические методы только в следующих сценариях:
источник
Есть несколько веских причин использовать статические методы:
Производительность : если вы хотите, чтобы какой-то код выполнялся, и не хотите создавать для этого дополнительный объект, вставьте его в статический метод. JVM также может оптимизировать статические методы (я думаю, что я когда-то читал Джеймса Гослинга, заявляющего, что вам не нужны пользовательские инструкции в JVM, поскольку статические методы будут такими же быстрыми, но не смогут найти источник - таким образом это может быть полностью ложным). Да, это микрооптимизация, и, вероятно, она не нужна. И мы, программисты, никогда не делаем ненужных вещей только потому, что они крутые, верно?
Практичность : вместо вызова
new Util().method(arg)
, вызоваUtil.method(arg)
илиmethod(arg)
со статическим импортом. Проще, короче.Добавление методов : вы действительно хотели, чтобы класс String имел
removeSpecialChars()
метод экземпляра, но его там нет (и не должно быть, поскольку специальные символы вашего проекта могут отличаться от других проектов), и вы не можете добавить его (поскольку Java несколько вменяемый), поэтому вы создаете служебный класс и вызываетеremoveSpecialChars(s)
вместоs.removeSpecialChars()
. Сладкий.Чистота : принимая некоторые меры предосторожности, ваш статический метод будет чистой функцией , то есть от него зависят только параметры. Данные в, данные в. Это легче читать и отлаживать, так как вам не нужно беспокоиться об особенностях наследования. Вы можете сделать это и с методами экземпляра, но компилятор поможет вам немного больше со статическими методами (не допуская ссылки на атрибуты экземпляра, переопределяющие методы и т. Д.).
Вам также нужно будет создать статический метод, если вы хотите создать синглтон, но ... не надо. Я имею в виду, подумай дважды.
Теперь, что более важно, почему вы не хотите создавать статический метод? В основном, полиморфизм уходит в окно . Вы не сможете ни переопределить метод,
ни объявить его в интерфейсе(до Java 8) . Это требует много гибкости от вашего дизайна. Кроме того, если вам нужно состояние , у вас будет много ошибок параллелизма и / или узких мест, если вы не будете осторожны.источник
После прочтения статей Миско я считаю, что статические методы плохие с точки зрения тестирования. Вместо этого у вас должны быть фабрики (возможно, с использованием инструмента внедрения зависимостей, такого как Guice ).
как мне убедиться, что у меня есть только один
Основная проблема со статическими методами - это процедурный код
источник
Math.abs()
илиArrays.sort()
даже методы, в которые можно передать все зависимости , я не понимаю, как это могло бы помешать модульному тестированию. Я бы сказал, что простое эмпирическое правило таково: если у вас есть какая-либо причина издеваться над процедурной логикой, не используйте статический метод. У меня никогда не было причин издеватьсяArrays.sort()
илиMath.abs()
.static
Метод является одним типа способа , который не требует какого - либо объекта , который будет инициализирован для того , чтобы назвать. Вы заметилиstatic
, используется вmain
функции в Java? Выполнение программы начинается оттуда без создания объекта.Рассмотрим следующий пример:
источник
Статические методы в java принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают входные данные от параметров, выполняют над ними действия, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.
источник
Нет, статические методы не связаны с экземпляром; они принадлежат к классу. Статические методы - ваш второй пример; методы экземпляра являются первыми.
источник
Если вы применяете статическое ключевое слово с любым методом, оно называется статическим методом.
// Программа изменения общего свойства всех объектов (статическое поле).
O / P: 111 индийских BBDIT 222 американских BBDIT 333 китайских BBDIT
источник
Статические методы не связаны с экземпляром, поэтому они не могут получить доступ к любым нестатическим полям в классе.
Вы бы использовали статический метод, если метод не использует какие-либо поля (или только статические поля) класса.
Если используются какие-либо нестатические поля класса, вы должны использовать нестатический метод.
источник
Статические методы должны вызываться в классе, методы экземпляра должны вызываться в экземплярах класса. Но что это значит на самом деле? Вот полезный пример:
Класс автомобиля может иметь метод экземпляра, называемый Accelerate (). Ускорить автомобиль можно только в том случае, если автомобиль действительно существует (был построен) и, следовательно, это будет метод экземпляра.
У автомобильного класса также может быть метод count, называемый GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если не было построено ни одного автомобиля, этот метод вернул бы 0, но его все равно можно было бы вызвать, и поэтому он должен был бы быть статическим методом.
источник
На самом деле, мы используем статические свойства и методы в классе, когда мы хотим использовать некоторую часть нашей программы, которая должна существовать там до тех пор, пока наша программа не будет запущена. И мы знаем, что для манипулирования статическими свойствами нам нужны статические методы, поскольку они не являются частью переменной экземпляра. А без статических методов манипулирование статическими свойствами занимает много времени.
источник
Используйте статический метод, когда вы хотите иметь доступ к методу без экземпляра класса.
источник
Статическая:
Obj.someMethod
Используйте,
static
когда вы хотите предоставить доступ к методу на уровне класса, т. Е. Когда метод должен вызываться без экземпляра класса.источник
Статические методы не нужно вызывать для объекта, и именно тогда вы его используете. Пример: ваш Main () является статическим, и вы не создаете объект для его вызова.
источник
Статические методы и переменные являются контролируемой версией глобальных функций и переменных в Java. В каких методах можно получить доступ как
classname.methodName()
илиclassInstanceName.methodName()
, то есть к статическим методам и переменным можно получить доступ, используя имя класса, а также экземпляры класса.Класс не может быть объявлен как статический (потому что это не имеет смысла. Если класс объявлен как открытый, к нему можно получить доступ откуда угодно), внутренние классы могут быть объявлены как статические.
источник
Статические методы могут быть использованы, если
Никто не хочет выполнять действие над экземпляром (служебные методы)
Один хочет использовать в качестве простой функции. Входные данные передаются явно, и получение данных результата в качестве возвращаемого значения. Наследование, объектное воплощение не входит в картину. Краткий, Читаемый .
ПРИМЕЧАНИЕ . Немногие люди выступают против тестируемости статических методов, но статические методы тоже можно тестировать! С помощью jMockit можно высмеивать статические методы. Тестируемость . Пример ниже:
источник
Статические методы - это методы в Java, которые можно вызывать без создания объекта класса. Это относится к классу.
Мы используем статический метод, когда нам не нужно вызывать метод с использованием instance.
источник
static
методов для доступа кstatic
полям.Но вы можете иметь
static
методы, не ссылаясь наstatic
переменные. Вспомогательные методы без ссылки наstatic
переменную можно найти в некоторых классах Java, таких как java.lang.Math.Другой вариант использования, который я могу представить в сочетании с
synchronized
методом, - реализация блокировки на уровне класса в многопоточной среде.Если вам нужен доступ к методу объекта-экземпляра класса, ваш метод должен быть нестатичным.
Страница документации Oracle содержит более подробную информацию.
Разрешены не все комбинации переменных и методов экземпляра и класса:
источник
A common use for static methods is to access static fields.
не аргумент.Статический метод имеет две основные цели:
источник
В eclipse вы можете включить предупреждение, которое поможет вам обнаружить потенциальные статические методы. (Над выделенной строкой есть еще одна, которую я забыл выделить)
источник
Всякий раз, когда вы не хотите создавать объект для вызова метода в вашем коде, просто объявите этот метод как статический. Поскольку статическому методу не требуется вызывать экземпляр, но здесь есть загвоздка, не все статические методы вызываются JVM автоматически. Эта привилегия используется только в методе main () "public static void main [String ... args]" в java, поскольку во время выполнения это метод Signature public "static" void main [], который JVM ищет в качестве точки входа в начать выполнение кода.
Пример:
Вывод: - Этот статический метод выполняется JVM. Этот статический метод должен вызываться явно. Этот статический метод должен вызываться явно. Этот статический метод должен вызываться явно.
источник