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

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

например

Obj x = new Obj();
x.someMethod

или

Obj.someMethod

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

Я довольно смущен!

+836
19 апр. '10 в 23:05
источник поделиться
22 ответа

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

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

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

+1347
19 апр. '10 в 23:42
источник

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

  • Если вы пишете служебные классы, и они не должны быть изменены.
  • Если метод не использует какую-либо переменную экземпляра.
  • Если какая-либо операция не зависит от создания экземпляра.
  • Если есть код, который может быть легко доступен всем методам экземпляра, извлеките этот код в статический метод.
  • Если вы уверены, что определение метода никогда не будет изменено или отменено. Поскольку статические методы не могут быть переопределены.
+503
15 мар. '11 в 14:40
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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

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

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

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

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

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

+163
11 дек. '13 в 15:03
источник

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

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

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

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

Основная проблема со статическими методами: они являются процедурным кодом. У меня нет Идея процедуры модульного тестирования. Модульное тестирование предполагает, что я могу создать экземпляр части моего приложения в изоляции. Во время создания Я подключаю зависимости с помощью mocks/friendlies, которые заменяют реальных зависимостей. С процедурной программирование нечего "прокладывать", поскольку объектов нет, код и данные разделены.

+39
20 апр. '10 в 1:14
источник

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.");
     }
  }
+31
10 июн. '14 в 9:59
источник

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

+18
19 апр. '10 в 23:08
источник

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

+11
19 апр. '10 в 23:08
источник

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

  1. Статический метод принадлежит классу, а не объекту класса.
  2. Статический метод вызывается без необходимости создания экземпляра класса.
  3. Статический метод может получить доступ к статическому члену данных и может изменить его значение.
  4. Доступ к статическому методу можно получить, просто используя имя статического имени точки класса. , , пример: 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 китайских BBDIT

+11
13 июн. '15 в 16:10
источник

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

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

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

+8
19 апр. '10 в 23:12
источник

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

+6
11 мар. '13 в 4:56
источник

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

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

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

+6
25 апр. '18 в 14:28
источник

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

+5
19 апр. '10 в 23:08
источник

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

+4
20 апр. '10 в 5:21
источник

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

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

+4
30 сент. '11 в 20:28
источник

Static: Obj.someMethod

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

+3
19 апр. '10 в 23:10
источник

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

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

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

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

    первый создает новый класс для каждого метода, Производительность, Практический. Примерами являются класс 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;
    }
};
+3
23 авг. '16 в 15:22
источник

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

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

+3
28 мая '17 в 8:57
источник

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

  • Общепринятым способом использования методов static является доступ к полям static.
  • Но вы можете иметь методы static, не ссылаясь на переменные static. Вспомогательные методы без ссылки static variable могут быть найдены в некоторых классах Java, таких как java.lang.Math

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

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

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

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

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

  • Методы экземпляров могут напрямую обращаться к переменным экземпляра и методам экземпляров.
  • Методы экземпляров могут напрямую обращаться к переменным класса и методам класса.
  • Методы класса могут напрямую обращаться к переменным класса и методам класса.
  • Методы класса не могут напрямую обращаться к переменным экземпляра или методам экземпляра - они должны использовать ссылку на объект. Кроме того, методы класса не могут использовать это ключевое слово, поскольку для этого не существует экземпляра.
+2
24 июл. '17 в 17:12
источник

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

  1. Для служебных или вспомогательных методов, которые не требуют какого-либо состояния объекта. Поскольку нет необходимости обращаться к переменным экземпляра, статические методы устраняют необходимость того, чтобы вызывающий объект создавал экземпляр объекта только для вызова метода.
  2. Для состояния, которое используется всеми экземплярами класса, например счетчиком. Все экземпляры должны иметь одно и то же состояние. Методы, которые просто используют это состояние, также должны быть статическими.
+2
05 февр. '18 в 7:42
источник

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

настройка затмения

+1
06 мар. '17 в 10:32
источник

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

Если применяются следующие условия, сделайте свой статический метод:

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

PS: Стоит упомянуть, что очень сложно или даже (не возможно) издеваться над статическим методом, насмехаясь - это механизм, используемый в модульном тестировании, чтобы подделать бизнес некоторых методы.

Подробнее см. Статическое ключевое слово в java

0
01 окт. '17 в 20:30
источник

Когда статические методы могут быть хорошими?

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

  1. Объявление истинной глобальной константы, а не глобальной переменной. Глобальная константа. Пример: Math.PI. Это справедливое сокращение для того, чтобы действительно сказать, что существует один экземпляр юниверса, и что синглтон юниверса содержит математическое понятие синглтона, в котором есть свойство PI, которое не изменяется. Эта концепция кажется нам странной, потому что мы привыкли не думать о ПИ в контексте объектно-ориентированной ответственности. Это стало бы более очевидным, если бы мы разрабатывали какую-то странную игру, в которой были альтернативные вселенные с различными математическими понятиями и константами.
  2. Создание объекта. Статические методы являются ценным и действительным методом создания объектов. Перегруженные конструкторы, которые принимают разные аргументы, не очень понятны и часто становятся понятнее, заменяя их статическим конструктором.

Когда статические методы плохие?

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

  2. Другая серьезная проблема со статическими методами - тестируемость. Тестируемость имеет большое значение при создании программного обеспечения. Статические методы, как известно, сложно тестировать, особенно когда они создают новые экземпляры конкретных классов. Если вы когда-либо работали с устаревшим кодом и пытались написать unit тест для статического метода, вы знаете мою боль.

  3. Статические методы также не являются полиморфными. Если вы создаете статический метод в классе, это поведение не переопределяется. Вы застряли с жестко закодированной ссылкой на эту реализацию.

Заключительные слова

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

0
15 июл. '19 в 12:41
источник

Посмотрите другие вопросы по меткам или Задайте вопрос