Одно правило большого пальца: спросите себя: «Имеет ли смысл называть этот метод, даже если объект Obj еще не создан?» Если это так, это определенно будет статичным.
Итак, в классе Car
у вас может быть метод double convertMpgToKpl(double mpg)
, который будет статичным, потому что можно было бы знать, к чему преобразуется 35mpg, даже если никто когда-либо строил Автомобиль. Но void setMileage(double mpg)
(который устанавливает эффективность одного конкретного автомобиля) не может быть статичным, так как немыслимо вызвать метод до того, как какой-либо автомобиль был сконструирован.
(Btw, обратное не всегда верно : иногда вы можете иметь метод, который включает в себя два объекта Car
и все еще хочет, чтобы он был статичным. Например Car theMoreEfficientOf( Car c1, Car c2 )
. Хотя это можно было бы преобразовать в нестатистическую версию, некоторые утверждают, что, поскольку нет «привилегированный» выбор того, какой автомобиль более важен, вы не должны заставлять вызывающего абонента выбирать один автомобиль как объект, на который вы будете ссылаться на этот метод. Однако эта ситуация составляет довольно небольшую часть всех статических методов.)
После чтения статей Misko я считаю, что статические методы плохи с точки зрения тестирования. Вместо этого вы должны иметь заводы (возможно, используя инструмент инъекции зависимостей, такой как Guice ).
имеет только что-то. Проблема «как обеспечить, чтобы у меня было только что-то», прекрасно обойдется. Вы создаете экземпляр только одного ApplicationFactory в своей основной форме, и в результате вы создаете экземпляр только одного экземпляра всех ваших синглетов.
blockquote>Основная проблема со статическими методами заключается в том, что они являются процедурным кодом
Основная проблема со статическими методами - это процедурный код. Я понятия не имею, как модульный код с модульным тестированием. Unit-testing предполагает, что я могу создать экземпляр части приложения отдельно. Во время создания я связываю зависимости с mocks / friendlies, которые заменяют реальные зависимости. При процедурной программировании нет ничего, чтобы «пронести», поскольку нет объектов, код и данные являются отдельными.
blockquote>
Math.abs()
или Arrays.sort()
, даже методы, которые вы можете передать все зависимости в i>, я не вижу, как это будет когда-либо препятствовать единичному тестированию. Я бы сказал, что простое эмпирическое правило: если у вас когда-либо возникнет какая-либо причина издеваться над процедурной логикой, то не ставьте ее статическим методом. У меня никогда не было причин издеваться над Arrays.sort()
или Math.abs()
.
– Andy
8 May 2015 в 20:24
Статические методы могут использоваться, если
1. new ABCClass(double farenheit).convertFarenheitToCelcium()
2. ABCClass.convertFarenheitToCelcium(double farenheit)
, первый создает новый класс для каждого метода invoke, Performance, Practical . Примерами являются класс Math и Apache-Commons StringUtils ниже: Math.random()
Math.sqrt(double)
Math.min(int, int)
StringUtils.isEmpty(String)
StringUtils.isBlank(String)
ПРИМЕЧАНИЕ. Немногие люди возражают против проверки статических методов, но статические методы также могут быть протестированы! С помощью jMockit можно издеваться над статическими методами. Тестируемость . Пример ниже:
new MockUp<ClassName>() {
@Mock
public int doSomething(Input input1, Input input2){
return returnValue;
}
};
Статические методы не связаны с экземпляром, поэтому они не могут получить доступ к каким-либо нестатическим полям в классе.
Вы использовали бы статический метод, если метод не использует никаких полей (или только статических полей) класса.
Если используются нестатические поля класса, вы должны использовать нестатический метод.
Статические методы следует вызывать в классе, методы экземпляра следует вызывать в экземплярах класса. Но что это значит на самом деле? Вот полезный пример:
Класс автомобиля может иметь метод экземпляра под названием Accelerate (). Вы можете только ускорить автомобиль, если автомобиль действительно существует (был построен), и поэтому это будет метод экземпляра.
Класс автомобиля может также иметь метод подсчета с именем GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если никакие автомобили не были построены, этот метод вернет 0, но он все равно должен быть вызван, и поэтому он должен быть статическим методом.
Нет, статические методы не связаны с экземпляром; они принадлежат классу. Статические методы - ваш второй пример; методы экземпляра являются первыми.
Статические методы и переменные - это управляемая версия функций и переменных «Глобальная» в Java. В каких методах можно получить доступ как classname.methodName()
или classInstanceName.methodName()
, то есть могут быть доступны статические методы и переменные, используя имя класса, а также экземпляры класса.
Класс не может быть объявлен как статический ( потому что это не имеет смысла. Если класс объявлен общедоступным, к нему можно получить доступ из любого места), внутренние классы могут быть объявлены статическими.
Static: Obj.someMethod
Используйте static
, если вы хотите предоставить доступ к классу на уровне класса, то есть где метод должен быть доступен для вызова без экземпляра класса.
Статический метод имеет две основные цели:
Статические методы распределяются между всеми экземплярами класса, разработчики обычно используют статическое ключевое слово с методами утилиты, которые выполняют некоторые общие функции, которые регулярно используются в любом месте приложения.
Если применяются следующие условия, сделайте свой метод статическим:
PS: Стоит упомянуть, что очень сложно или даже (возможно) статический метод, издевательский - это механизм, используемый в модульном тестировании для подделки бизнеса некоторыми методами.
Для получения дополнительной информации проверьте: Статическое ключевое слово в 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 Китай BBDIT
Используйте статический метод, когда вы хотите иметь доступ к методу без экземпляра класса.
Метод 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 относятся к классу (а не к экземпляру). Они не используют переменные экземпляра и обычно принимают входные данные из параметров, выполняют действия над ним, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.
Статические методы - это методы в Java, которые можно вызывать без создания объекта класса. Он принадлежит классу.
Мы используем статический метод, когда нам не нужно вызывать метод с использованием экземпляра.
Мне интересно, когда использовать статические методы?
blockquote>
- Общим методом использования для
static
методов является доступ к полямstatic
.- Но вы можете иметь методы
static
, не ссылаясь на переменныеstatic
. Вспомогательные методы без ссылки на переменнуюstatic
можно найти в некоторых Java-классах, таких как java.lang.Mathpublic static int min(int a, int b) { return (a <= b) ? a : b; }
- В другом случае использования, я могу думать об этих методах вместе с
synchronized
метод - это реализация блокировки уровня класса в многопоточной среде.Скажите, есть ли у меня класс с несколькими геттерами и сеттерами, метод или два, и я хочу, чтобы эти методы были только invokable для объекта экземпляра класса. Означает ли это, что я должен использовать статический метод?
blockquote>Если вам нужен метод доступа к экземпляру объекта класса, ваш метод должен быть не статическим.
Документация Oracle страница содержит более подробную информацию.
Не все комбинации переменных и методов экземпляра и класса разрешены:
- Методы экземпляров могут напрямую обращаться к переменным экземпляра и методам экземпляра.
- Методы экземпляра могут напрямую обращаться к переменным класса и методам класса.
- Методы класса могут напрямую обращаться к переменным класса и методам класса.
- Методы класса не могут напрямую обращаться к переменным экземпляра или методам экземпляра - они должны использовать объект Справка. Кроме того, методы класса не могут использовать это ключевое слово, поскольку для этого не существует экземпляра.
На самом деле мы используем статические свойства и методы в классе, когда мы хотим использовать часть нашей программы, которая должна существовать там до тех пор, пока наша программа не будет запущена. И мы знаем, что для управления статическими свойствами нам нужны статические методы, поскольку они не являются частью переменной экземпляра. И без статических методов управлять статическими свойствами занимает много времени.
Определите статические методы только в следующих сценариях:
Есть несколько веских причин использовать статические методы:
new Util().method(arg)
вызовите Util.method(arg)
или method(arg)
со статическим импортом. removeSpecialChars()
, но его нет (и этого не должно быть, так как специальные символы вашего проекта могут отличаться от другой проект), и вы не можете его добавить (поскольку Java является довольно разумным), поэтому вы создаете класс утилиты и вызываете removeSpecialChars(s)
вместо s.removeSpecialChars()
. Sweet. Также нужно создать статический метод, если вы хотите сделать одноэлементный, но ... нет. Я имею в виду, подумайте дважды.
Теперь, что более важно, , почему вы не хотели бы создавать статический метод? В принципе, полиморфизм выходит из окна. Вы не сможете переопределить этот метод и не объявить его в интерфейсе (pre-Java 8) . Это требует большой гибкости от вашего дизайна. Кроме того, если вам нужно состояние, у вас будет много ошибок параллелизма и / или узких мест, если вы не будете осторожны.
В eclipse вы можете включить предупреждение, которое поможет вам обнаружить потенциальные статические методы. (Над выделенной линией еще одна, которую я забыл выделить)
Статические методы не должны вызываться на объекте, и это когда вы его используете. Пример: ваш Main () является статичным, и вы не создаете объект для его вызова.
Car#isMoreEfficientThan(Car)
. Преимущество состоит в том, что автомобиль, который вы возвращаете в галстуке, не является произвольным. По названию метода очевидно, что возвращается в галстуке. – Cruncher 7 January 2014 в 16:03