Когда следует использовать статические методы
Я хочу разобраться, когда использовать статические методы. Допустим, у меня есть класс с несколькими геттерами и сеттерами, а также парой методов, и я хочу, чтобы эти методы можно было вызывать только у экземпляра объекта этого класса. Значит ли это, что я должен использовать статический метод?
Пример:
Obj x = new Obj();
x.someMethod();
...или:
Obj.someMethod(); // Это статический способ?
Я немного запутался!
5 ответ(ов)
Правило большого пальца: задайте себе вопрос: «Имеет ли смысл вызывать этот метод, даже если объекты еще не были созданы?» Если да, то метод определенно должен быть статическим.
Например, в классе Car
вы можете иметь метод:
double convertMpgToKpl(double mpg)
Этот метод должен быть статическим, потому что может возникнуть необходимость узнать, сколько километров на литр соответствует 35 миль на галлон, даже если никто никогда не создавал объект Car
. Однако метод, который устанавливает эффективность конкретного автомобиля:
void setMileage(double mpg)
не может быть статическим, так как невозможно вызвать его до того, как какой-либо экземпляр Car
будет создан.
Стоит отметить, что обратное не всегда верно: вы можете иметь метод, который работает с двумя объектами Car
, и при этом захотите, чтобы он оставался статическим. Например:
Car theMoreEfficientOf(Car c1, Car c2)
Хотя этот метод можно было бы сделать нестатическим, некоторые могут утверждать, что поскольку нет «привилегированного» выбора, какой Car
более важен, не следует заставлять вызывающую сторону выбирать один из объектов для вызова метода. Однако такие случаи составляют довольно небольшую долю всех статических методов.
Определяйте статические методы в следующих ситуациях:
- Если вы создаете утилитарные классы и предполагается, что они не будут изменяться.
- Если метод не использует никаких переменных экземпляра.
- Если выполнение операции не зависит от создания экземпляра.
- Если есть код, который можно легко использовать во всех методах экземпляра, извлеките его в статический метод.
- Если вы уверены, что определение метода никогда не будет изменено или переопределено, так как статические методы не могут быть переопределены.
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.");
}
}
В этом примере метод display
объявлен как static
, что позволяет вызывать его напрямую из метода main
, который также является статическим. Это демонстрирует основное назначение статических методов: они связаны с классом, а не с конкретными объектами.
Статические методы в Java принадлежат классу, а не его экземпляру. Они не используют переменные экземпляра и обычно принимают данные через параметры, выполняют какие-то действия с ними, а затем возвращают результат. Метод экземпляра связан с объектами и, как следует из названия, может использовать переменные экземпляра.
Нет, статические методы не связаны с экземпляром; они принадлежат классу. Статические методы — это ваш второй пример; экземплярные методы — это первый.
Каков эквивалент статических методов Java в Kotlin?
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?