Если все методы, которые не используют переменные экземпляра, будут помечены как статические
Предположим, что у меня есть класс:
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){
Ответы
Ответ 1
Для максимальной стилистической гигиены да, частные методы, которые не используют какое-либо состояние объекта, но имеют смысл только внутри объекта, должны быть статическими.
Это самый ясный (и самый строгий) способ показать, как они действуют, и это поможет вам быть осторожным в отношении вашего дизайна вокруг границ метода и подумать дважды, если вы решите пойти изменить один из них позже, чтобы использовать данные объекта.
FWIW, я не подозреваю, что здесь имеет место соответствующее влияние на производительность (теоретически статичность проще вызвать из-за неявной ссылки this
). Кроме того, вы можете сходить с ума, будучи строгим в этом коде, но это, безусловно, разумная цель.
N.B. Публичные методы требуют большего внимания, прежде чем маркировать их статическими; они не могут измениться по дороге без воздействия на вызывающих абонентов, поэтому "невыполнение обязательств" не всегда является правильным выбором.
Ответ 2
Если вы спрашиваете себя, это ваш дизайн уже шаткий. Вы должны разорвать все эти "статические" функции вне класса и поместить их в общий статический класс контейнера для многоразового использования.
Посмотрите на свой код, что делает convertToMiles
отношение к автомобилю? Это универсальный алгоритм, который можно повторно использовать в нескольких функциях.
Ответ 3
Определенный NO для ВСЕ таких методов.
Например, вполне законно, что такой метод вычисляет результат (возвращаемое значение) только по его аргументам, и автор хотел бы разрешить другим изменять расчет в подклассе. (Это какой-то шаблон шаблона шаблона.) И переопределение класса может быть выполнено только в том случае, если они... не.. static.
Btw: если вы измените свой вопрос и попросите только частные методы, то я не могу спорить таким образом. Но вы просили все методы.
Ответ 4
Использование static
может привести к разным характеристикам производительности, однако это менее вероятно, если он встроен, поскольку он не будет вызываться как можно больше.
static
полезен, поскольку он дает понять, что вы не получаете доступа к каким-либо полям-членам. Это вызвало некоторые ошибки для меня в прошлом, когда я пометил метод как статический, но это вызвало ошибку (потому что не должно было использоваться поле члена)
Вы можете проявить творческий подход к дизайну и добавить слои и сложность, которые могут быть полезны в один прекрасный день, но я бы пошел с принципом YANGI и сказал, что маловероятно, что вы захотите изменить способ преобразования килограммов в мили, или если вы его измените, вы вряд ли захотите больше, чем один из способов сделать это.
Ответ 5
да. Используйте статические методы, когда сможете.
Ответ 6
private static double convertToMiles(double km){}
Это будет правильным для вашего программного кода, поскольку метод convertToMiles()
не имеет ничего общего с переменной экземпляра.
Но имейте в виду, что этот метод не может использоваться повторно в другом классе нестационарными членами, если да, то сама цель статического не используется, поскольку статические избегают множественного создания объекта и потери памяти.