Java: когда следует использовать статические методы

Меня интересует, когда следует использовать статические методы? Скажем, если у меня есть класс с несколькими геттерами и сеттерами, одним или двумя методами, и я хочу, чтобы эти методы вызывались только у объекта экземпляра класса. Значит ли это, что я должен использовать статический метод?

Например

Obj x = new Obj();
x.someMethod

или

Obj.someMethod

(это статический способ?)

Я'совсем запутался!

Решение

Одно правило: спросите себя: «Имеет ли смысл называть этот метод, даже если Обдж еще не построен?«Если это так, это определенно должно быть статично.

Таким образом, в классе «Car» у вас может быть метод «двойной конвертированиеMpgToKpl (двойная mpg)», который будет статичным, потому что можно узнать, к чему преобразуется 35 миль на галлон, даже если никто никогда не создавал автомобиль. Но «void setMileage (двойная миль на галлон)» (который устанавливает эффективность одного конкретного автомобиля) не может быть статичным, поскольку немыслимо вызывать метод до того, как будет построен какой-либо автомобиль.

(Кстати, обратное не всегда верно: у вас иногда может быть метод, который включает в себя два объекта «Автомобиль», и все же вы хотите, чтобы он был статичным. Например. Car theMoreEfficientOf (Автомобиль c1, Автомобиль c2). Хотя это может быть преобразовано в нестатическую версию, некоторые утверждают, что, поскольку не существует «привилегированного» выбора, какой автомобиль важнее, вам не следует заставлять вызывающего абонента выбирать один автомобиль в качестве объекта, который вы будете вызвать метод на. Эта ситуация составляет довольно небольшую долю всех статических методов.)

Комментарии (18)

Определите статические методы только в следующих сценариях:

  1. Если вы пишете полезные классы, и они не должны быть изменены.
  2. Если метод не использует какую-либо переменную экземпляра.
  3. Если какая-либо операция не зависит от создания экземпляра.
  4. Если есть какой-то код, который можно легко использовать всеми методами экземпляра, извлеките этот код в статический метод.
  5. Если вы уверены, что определение метода никогда не будет изменено или переопределено. Поскольку статические методы не могут быть переопределены.
Комментарии (6)

Есть несколько веских причин использовать статические методы:

  • Производительность : если вы хотите запустить какой-то код и не хотите создавать для этого дополнительный объект, вставьте его в статический метод. JVM также может много оптимизировать статические методы (я думаю, что однажды я прочитал Джеймса Гослинга, заявляющего, что вам не нужны пользовательские инструкции в JVM, поскольку статические методы будут такими же быстрыми, но не смогут найти источник - таким образом это может быть полностью ложным). Да, это микрооптимизация, и, вероятно, она не нужна. И мы, программисты, никогда не делаем ненужных вещей только потому, что они крутые, верно?

  • Практичность : вместо вызова new Util () .method (arg), вызов Util.method (arg) или method (arg) со статическим импортом. Проще, короче.

  • Методы добавления : вы действительно хотели, чтобы класс String имел removeSpecialChars( метод экземпляра, но это 'там нет (и это должно 'т, с вашего проекта 'Специальные символы могут отличаться от других проектов 's) и вы можете 'добавь это (так как Java несколько вменяемая) так что вы создаете класс полезности, и позвоните removeSpecialChars(s)вместоs.removeSpecialChars(. Сладкий.

  • Чистота : принимая некоторые меры предосторожности, ваш статический метод будет чистой функцией, то есть единственное, от чего он зависит, это его параметры. Данные в, данные вне. Это легче читать и отлаживать, так как вам не о чем беспокоиться о наследстве. Вы также можете сделать это с помощью методов экземпляра, но компилятор поможет вам немного больше со статическими методами (не позволяя ссылаться на атрибуты экземпляра, переопределяющие методы и т. Д.).).

Вам также придется создать статический метод, если вы хотите сделать синглтон, но... не. Я имею в виду, подумай дважды.

Теперь, что более важно, почему вы не хотите создавать статический метод? В основном полиморфизм выходит из окна . Вы не сможете переопределить метод, < strike > и объявить его в интерфейсе < / strike > (до Java 8) . Это требует большой гибкости от вашего дизайна. Кроме того, если вам нужно state , вы получите много ошибок в валюте и / или узких мест, если вы не будете осторожны.

Комментарии (6)

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

как мне гарантировать, что у меня есть только один из чего-то

есть только один из чего-то Проблема «как мне убедиться, что я есть только один из чего-то »хорошо обошел стороной. Вы создаете только a один ApplicationFactory в вашем основной, и в результате только вы создать один экземпляр из всех ваших синглетонов.

Основная проблема статических методов заключается в том, что они являются процедурным кодексом

Основная проблема со статическими методами они процедурный код. У меня нет идея, как модульно протестировать процедурный код. Тестирование предполагает, что я могу представьте часть моего приложения в изоляции. Во время создания Я связываю зависимости с издевки / товарищеские матчи, которые заменяют реальные зависимости. С процедурным программированию нечего «проводеть» так как нет объектов, код и данные являются отдельными.

Комментарии (10)

Метод 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.");
     }
  }
Комментарии (2)

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

Комментарии (0)

Если вы применяете статическое ключевое слово с любым методом, оно называется статическим методом.

  1. Статический метод принадлежит классу, а не объекту класса.
  2. Статический метод вызывается без необходимости создания экземпляра класса.
  3. статический метод может получить доступ к статическим данным и изменить его значение.
  4. Доступ к статическому методу можно получить, просто используя имя статического имени класса dot . . . пример: Student9.change ();
  5. Если вы хотите использовать нестатические поля класса, вы должны использовать нестатический метод.

// Программа изменения общего свойства всех объектов (статическое поле).

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 Китай ББДИТ

Комментарии (1)

Нет, статические методы не связаны с экземпляром, они принадлежат классу. Статические методы - это ваш второй пример, а методы экземпляра - первый.

Комментарии (1)

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

Вы бы использовали статический метод, если метод не использует какие-либо поля (или только статические поля) класса.

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

Комментарии (1)

Статические методы должны быть вызваны на класс, методы экземпляра должны быть вызваны на экземпляры класса. Но что это значит на самом деле? Вот полезный пример:

У автомобильного класса может быть метод экземпляра, называемый Accelerate (). Вы можете ускорить работу автомобиля, только если автомобиль действительно существует (был сконструирован), и поэтому это будет метод экземпляра.

В автомобильном классе также может быть метод подсчета GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если бы не было построено ни одного автомобиля, этот метод вернул бы 0, но он все еще должен быть в состоянии быть вызванным, и, следовательно, он должен быть статическим методом.

Комментарии (0)

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

Комментарии (1)

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

Комментарии (1)

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

Комментарии (2)

Статические методы и переменные являются контролируемой версией «глобальных» функций и переменных в Java. В каких методах можно получить доступ как classname.methodName () или classInstanceName.methodName (), т.е. статические методы и переменные могут быть доступны с использованием имени класса, а также экземпляров класса.

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

Комментарии (0)

Статические методы - это методы на Java, которые можно вызывать без создания объекта класса. Это принадлежит классу.

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

Комментарии (0)

Статический: Obj.someMethod

Используйте static, когда вы хотите предоставить доступ к методу на уровне класса, т.е. где метод должен быть вызываемым без экземпляра класса.

Комментарии (0)

Статические методы могут быть использованы, если

  • Никто не хочет выполнять действие на экземпляр (методы утилиты)

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

    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 (Струна)
  • Один хочет использовать как простую функцию. Входные данные передаются явно и получают данные результата в качестве возвращаемого значения. Наследование, подстрекательство объекта не входит в картину. Concise, читаемый .

ПРИМЕЧАНИЕ: Мало кто спорит против тестируемости статических методов, но статические методы также могут быть проверены! С jMockit можно издеваться над статическими методами. проверяемость . Пример ниже:

new MockUp() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};
Комментарии (0)

Мне интересно, когда использовать статические методы?

  1. Обычное использование методов static - доступ к полям static.

  2. Но вы можете иметь «статические» методы, не ссылаясь на «статические» переменные. Методы помощи без ссылки на переменную static можно найти в некоторых классах Java, таких как [java.lang.Math][1]

    публичный статический int min (int a, int b) {
        возврат (a < = b) ? а: б;
    }
  3. Другой вариант использования, я могу думать об этих методах в сочетании с методом синхронизированного, - это реализация блокировки уровня класса в многопоточной среде.

Скажите, если у меня есть класс с несколькими getters и setters, метод или два, и я хочу, чтобы эти методы были недоступны только для объекта экземпляра класса. Означает ли это, что я должен использовать статический метод?

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

Документация Oracle страница содержит более подробную информацию.

Не все комбинации переменных и методов экземпляра и класса разрешены:

  1. Методы экземпляра могут получить доступ к переменным экземпляра и методам экземпляра напрямую.
  2. Методы экземпляра могут получить доступ к переменным класса и методам класса напрямую.
  3. Методы класса могут получить доступ к переменным класса и методам класса напрямую.
  4. Методы класса не могут получить доступ к переменным экземпляра или методам экземпляра напрямую - они должны использовать ссылку на объект. Кроме того, методы класса не могут использовать это ключевое слово, так как нет экземпляра для этого, к которому можно обратиться.

[1]: http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Math.java/?v = источник

Комментарии (1)

Статический метод имеет две основные цели:

  1. Для вспомогательных или вспомогательных методов, которые не требуют какого-либо состояния объекта. Поскольку нет необходимости доступа к переменным экземпляра, имеющим статический доступ методы устраняют необходимость для вызывающего абонента создавать объект просто чтобы назвать метод.
  2. Для государства, которое разделяют все экземпляры класса, как счетчик. Весь экземпляр должен делиться такое же состояние. Методы, которые просто используют это состояние, должны быть статичными хорошо.
Комментарии (0)

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

Комментарии (0)