Подтвердить что ты не робот

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

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

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){
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Определенный NO для ВСЕ таких методов.

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

private static double convertToMiles(double km){}

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

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