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

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

Эл.г

Obj x = new Obj();
x.someMethod

или

Obj.someMethod

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

Я в замешательстве!

20 ответов


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

в классе Car У вас может быть метод double convertMpgToKpl(double mpg) который был бы статическим, потому что можно было бы узнать, что преобразует 35mpg, даже если никто никогда не строил автомобиль. Но!--2--> (который устанавливает эффективность одного конкретного автомобиля) не может быть статическим, поскольку немыслимо вызвать метод до того, как какой-либо автомобиль был построен.

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


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

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

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

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

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

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

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

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

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


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

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

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

основная проблема со статическими методами-это процедурный код

основная проблема со статическими методами это процессуальный кодекс. У меня нет идея как unit-test процессуальный код. Модульное тестирование предполагает, что я могу создать кусочек моего приложения в изоляции. Во время создания экземпляра Я провода зависимости с насмешки / товарищеские матчи которые заменяют реальные зависимости. С процедурным Программирование нет ничего, чтобы " провод" поскольку объектов нет, код и данные разделены.


A 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 принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают входные данные от параметров, выполняют действия над ним, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.


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


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

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

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

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


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

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

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


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


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


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

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


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

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


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


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

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

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

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    

    первый создает новый след класса для каждого вызова метода,Производительность, Практичный. Примерами являются Math и Apache-Commons library 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;
    }
};

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

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


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

  1. С помощью static методы для доступа static поля.
  2. но вы можете иметь static методы, без ссылки static переменные. Вспомогательные методы без ссылки static переменная может быть найдена в некоторых классах java, таких как java.ленг.Математика!--17-->

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

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

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

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

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

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

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

eclipse setting


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

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

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

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

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