Меня интересует, когда следует использовать статические методы? Скажем, если у меня есть класс с несколькими геттерами и сеттерами, одним или двумя методами, и я хочу, чтобы эти методы вызывались только у объекта экземпляра класса. Значит ли это, что я должен использовать статический метод?
Например
Obj x = new Obj();
x.someMethod
или
Obj.someMethod
(это статический способ?)
Я'совсем запутался!
Одно правило: спросите себя: «Имеет ли смысл называть этот метод, даже если Обдж еще не построен?«Если это так, это определенно должно быть статично.
Таким образом, в классе «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 , вы получите много ошибок в валюте и / или узких мест, если вы не будете осторожны.
Прочитав статьи Миско, я считаю, что статические методы плохи с точки зрения тестирования. Вместо этого у вас должны быть фабрики (возможно, с помощью инструмента для инъекций зависимостей, такого как рука).
есть только один из чего-то Проблема «как мне убедиться, что я есть только один из чего-то »хорошо обошел стороной. Вы создаете только a один ApplicationFactory в вашем основной, и в результате только вы создать один экземпляр из всех ваших синглетонов.
Основная проблема со статическими методами они процедурный код. У меня нет идея, как модульно протестировать процедурный код. Тестирование предполагает, что я могу представьте часть моего приложения в изоляции. Во время создания Я связываю зависимости с издевки / товарищеские матчи, которые заменяют реальные зависимости. С процедурным программированию нечего «проводеть» так как нет объектов, код и данные являются отдельными.
Метод static
- это метод одного типа, который не нуждается в инициализации какого-либо объекта для его вызова. Вы заметили, что static
используется в функции main
в Java? Выполнение программы начинается оттуда без создания объекта.
Рассмотрим следующий пример:
class Languages
{
public static void main(String[] args)
{
display();
}
static void display()
{
System.out.println("Java is my favorite programming language.");
}
}
Статические методы в java принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают на вход параметры, выполняют над ними действия, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.
Если вы применяете статическое ключевое слово с любым методом, оно называется статическим методом.
// Программа изменения общего свойства всех объектов (статическое поле).
class Student9{
int rollno;
String name;
static String college = "ITS";
static void change(){
college = "BBDIT";
}
Student9(int r, String n){
rollno = r;
name = n;
}
void display (){System.out.println(rollno+" "+name+" "+college);}
public static void main(String args[]){
Student9.change();
Student9 s1 = new Student9 (111,"Indian");
Student9 s2 = new Student9 (222,"American");
Student9 s3 = new Student9 (333,"China");
s1.display();
s2.display();
s3.display();
} }
O / P: 111 индийских BBDIT 222 американский BBDIT 333 Китай ББДИТ
Статические методы не связаны с экземпляром, поэтому они не могут получить доступ к нестатическим полям в классе.
Вы бы использовали статический метод, если метод не использует какие-либо поля (или только статические поля) класса.
Если используются какие-либо нестатические поля класса, вы должны использовать нестатический метод.
Статические методы должны быть вызваны на класс, методы экземпляра должны быть вызваны на экземпляры класса. Но что это значит на самом деле? Вот полезный пример:
У автомобильного класса может быть метод экземпляра, называемый Accelerate (). Вы можете ускорить работу автомобиля, только если автомобиль действительно существует (был сконструирован), и поэтому это будет метод экземпляра.
В автомобильном классе также может быть метод подсчета GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если бы не было построено ни одного автомобиля, этот метод вернул бы 0, но он все еще должен быть в состоянии быть вызванным, и, следовательно, он должен быть статическим методом.
На самом деле, мы используем статические свойства и методы в классе, когда мы хотим использовать какую-то часть нашей программы, которая должна существовать там до тех пор, пока наша программа не будет запущена. И мы знаем, что для манипулирования статическими свойствами нам нужны статические методы, поскольку они не являются частью переменной экземпляра. А без статических методов манипулирование статическими свойствами занимает много времени.
Статические методы не нужно вызывать на объекте, и именно тогда вы используете его. Пример: ваш Main () является статичным, и вы не создаете объект для его вызова.
Статические методы и переменные являются контролируемой версией «глобальных» функций и переменных в Java. В каких методах можно получить доступ как classname.methodName ()
или classInstanceName.methodName ()
, т.е. статические методы и переменные могут быть доступны с использованием имени класса, а также экземпляров класса.
Класс не может быть объявлен статическим (потому что это не имеет смысла. если класс объявлен общедоступным, к нему можно получить доступ из любого места), внутренние классы могут быть объявлены статическими.
Статические методы могут быть использованы, если
Как упоминалось в нескольких вышеупомянутых ответах в этом посте, преобразование миль в километры или расчет температуры от Фаренгейта до Цельсия и наоборот. С этими примерами, использующими статический метод, не нужно создавать целые новые объекты в куче памяти. Рассмотрим ниже
1. новый ABCClass (двойной farenheit) .convertFarenheitToCelcium ()
2. ABCClass.convertFarenheitToCelcium (двойной градус)
первый создает новый класс следа для каждого вызова метода, Performance, Practical . Примерами являются библиотека Math и Apache-Commons StringUtils, приведенная ниже:
Math.random ()
Math.sqrt (двойной)
Math.min (int, int)
StringUtils.isEmpty (Строка)
StringUtils.isBlank (Струна)
ПРИМЕЧАНИЕ: Мало кто спорит против тестируемости статических методов, но статические методы также могут быть проверены! С jMockit можно издеваться над статическими методами. проверяемость . Пример ниже:
new MockUp<ClassName>() {
@Mock
public int doSomething(Input input1, Input input2){
return returnValue;
}
};
Мне интересно, когда использовать статические методы?
Обычное использование методов static
- доступ к полям static
.
Но вы можете иметь «статические» методы, не ссылаясь на «статические» переменные. Методы помощи без ссылки на переменную static
можно найти в некоторых классах Java, таких как [java.lang.Math][1]
публичный статический int min (int a, int b) {
возврат (a < = b) ? а: б;
}
Другой вариант использования, я могу думать об этих методах в сочетании с методом синхронизированного
, - это реализация блокировки уровня класса в многопоточной среде.
Скажите, если у меня есть класс с несколькими getters и setters, метод или два, и я хочу, чтобы эти методы были недоступны только для объекта экземпляра класса. Означает ли это, что я должен использовать статический метод?
Если вам нужен метод доступа к объекту экземпляра класса, ваш метод должен быть нестатическим.
Документация Oracle страница содержит более подробную информацию.
Не все комбинации переменных и методов экземпляра и класса разрешены:
[1]: http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Math.java/?v = источник
Статический метод имеет две основные цели: