Почему было бы выгодно использовать статический метод и передавать ссылку на объект в качестве параметра, а не вызывать метод объекта?
Чтобы уточнить, что я имею в виду, рассмотрим следующий класс:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
По сравнению с этой альтернативной реализацией со статическим методом:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Мой вопрос не ограничивается только этим классом; меня интересует любая точка, в которой вы передаете объект вместо вызова его в методе. Является ли это когда-либо выгодным? Если так, то почему?
java
object-oriented
static-methods
Аддисон Крамп
источник
источник
Ответы:
Тривиальный пример: когда переданный экземпляр может на законных основаниях быть нулевым, и вы хотите включить (нетривиальную) обработку этого в метод.
источник
В вашем примере метод instance - явный победитель.
В общем случае я могу подумать о нескольких причинах, когда статический метод может быть уместным:
Вы хотите поместить статический метод в другой класс, поскольку у вас есть ситуация, когда имеет смысл отделить логику от данных (примечание: ваш пример не один из них).
Вы передаете два или более объектов и хотите подчеркнуть, что они имеют одинаковое значение.
null
является допустимым значением (как объяснено пользователем 9000).источник
Было бы целесообразно включить методы, которые изменяют состояние объекта, в качестве методов экземпляра, а не статического метода.
Однако мы можем найти примеры статических методов, которые являются
pure
методами и принимают объект в качестве входных данных, например, когда нам нужно создать экземпляр объекта на основе определенных правил проверки. Например, в .NET есть методDateTime.TryParse(String s, DateTime d)
для проверки и создания экземпляра объекта. Но параметрDateTime d
явно помечен какout
.Другой случай может быть, когда мы сравниваем объекты и хотим получить желаемый объект как возвращаемое значение, а не логическое / целочисленное значение результата сравнения, например
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
,. Это будет чище, чем:(оставив корпус "вытянуть" для простоты).
источник
out
это.Net
ключевое слово, используемое в качестве модификатора параметра. В нем говорится, что параметр передается по ссылке. См. Подробности: msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
то М вполне может получить доступx
. Напримерint y = (new C()).x;
законно.static void M() { this.x = 1; }
не возможно.this.x
это неправильно не потому,x
что к нему нельзя получить доступ, а потому чтоthis
его не существует. Это не вопрос доступа вообще, это вопрос существования .Внедрение зависимостей будет хорошей причиной для выполнения вызова статического метода. Предполагая, что конкретная реализация
SomeClass
имеет цепочку наследования или является реализацией другого класса. Вы можете использовать макет объекта, передать его в целях тестирования, чтобы убедиться, что ваш метод делает то, что должен, и затем отчитаться об этом состоянии.источник