Dlaczego miałaby być korzyść ze stosowania metody statycznej i przekazywania odwołania do obiektu jako parametru zamiast wywoływania metody na obiekcie?
Aby wyjaśnić, co mam na myśli, rozważ następującą klasę:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
W porównaniu z tą alternatywną implementacją metodą statyczną:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Moje pytanie nie ogranicza się tylko do tej klasy; interesuje mnie każdy punkt, w którym można przekazać obiekt zamiast wywoływać go za pomocą metody. Czy jest to kiedykolwiek korzystne? Jeśli tak, to dlaczego?
java
object-oriented
static-methods
Addison Crump
źródło
źródło
Odpowiedzi:
Trywialny przykład: kiedy przekazana instancja może być zerowa i chcesz włączyć (nietrywialną) obsługę tej metody do metody.
źródło
W twoim przykładzie metoda instancji jest wyraźnym zwycięzcą.
W ogólnym przypadku mogę wymyślić kilka powodów, dla których statyczna metoda może być odpowiednia:
Chcesz umieścić metodę statyczną w innej klasie, ponieważ masz sytuację, w której sensowne jest oddzielenie logiki od danych (uwaga: twój przykład nie jest jedną z nich).
Mijasz dwa lub więcej obiektów i chcesz podkreślić, że mają one jednakowe znaczenie.
null
jest prawidłową wartością (zgodnie z wyjaśnieniem użytkownika 9000).źródło
Mądrze byłoby uwzględnić metody zmieniające stan obiektu jako metody instancji zamiast metody statycznej .
Możemy jednak znaleźć przykłady metod statycznych, które są
pure
metodami, i przyjąć obiekt jako dane wejściowe, na przykład gdy musimy utworzyć instancję obiektu na podstawie pewnych reguł sprawdzania poprawności. Na przykład .NET ma metodęDateTime.TryParse(String s, DateTime d)
sprawdzania poprawności i tworzenia instancji obiektu. Ale parametrDateTime d
jest wyraźnie oznaczony jakoout
.Kolejny przypadek może mieć miejsce, gdy porównujemy obiekty i chcemy uzyskać pożądany obiekt jako wartość zwracaną, a nie na przykład wartość logiczną / całkowitą wyniku porównania
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
. Będzie to czystsze niż:(pozostawiając przypadek „wyciągnąć” dla uproszczenia).
źródło
out
jest.Net
słowem kluczowym używanym jako modyfikator parametru. Wskazuje, że parametr jest przekazywany przez odwołanie. Zobacz szczegóły msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
to M ma doskonały dostępx
. Na przykładint y = (new C()).x;
jest legalny.static void M() { this.x = 1; }
nie jest możliwe.this.x
jest to złe nie dlatego, żex
nie można uzyskać do niego dostępu, ale dlatego,this
że nie istnieje. To wcale nie jest kwestia dostępu , to kwestia istnienia .Zastrzyk zależny byłby dobrym powodem do wywołania metody statycznej. Zakładając, że konkretna implementacja
SomeClass
ma łańcuch dziedziczenia lub jest implementacją innej klasy. Możesz użyć makiety obiektu, przekazać go do celów testowych, aby upewnić się, że twoja metoda robi to, co powinna, a następnie zgłosić ten status.źródło