Должны ли все методы, которые не используют переменные экземпляра, быть помечены как статические - PullRequest
28 голосов
/ 29 августа 2011

Предположим, у меня есть такой класс:

public class Car {

    private double distanceDriven;

    public void drive(double miles){
        distanceDriven += miles;
    }

    public void driveInCanada(double kilometer){
        distanceDriven += convertToMiles(kilometer);
    }

    private double convertToMiles(double km){
        return km*0.621371192;
    }   
}

Вы можете видеть, что convertToMiles - это:

  • , не использующий никаких переменных экземпляраиспользуется только внутри класса

Должен ли он быть объявлен как статический?Это никак не меняет функциональность функции (см. Выше).Я думаю, что это может повлиять:

  • удобочитаемость
  • производительность
  • другое?

Если функция convertToMiles выглядит следующим образом:

    private double convertToMiles(double km){

или

    private static double convertToMiles(double km){

Ответы [ 6 ]

18 голосов
/ 29 августа 2011

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

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

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

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

6 голосов
/ 29 августа 2011

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

Посмотрите на свой код, какое отношение имеет convertToMiles к машине? Это общий алгоритм, который можно использовать в нескольких функциях.

4 голосов
/ 29 августа 2011

Окончательный NO для ALL таких методов.

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

Кстати: если вы измените свой вопрос и зададите только для закрытых методовТогда я не мог спорить таким образом.Но вы просили все виды методов.

4 голосов
/ 29 августа 2011

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

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

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

2 голосов
/ 29 августа 2011

да.Используйте статические методы, когда можете.

1 голос
/ 25 мая 2013
private static double convertToMiles(double km){}

Это будет правильным для вашего программного кода, так как метод convertToMiles() не имеет ничего общего с переменной экземпляра.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...