Perché passare oggetti attraverso metodi statici può essere vantaggioso?

10

Perché ci sarebbe un vantaggio nell'usare un metodo statico e passare il riferimento a un oggetto come parametro piuttosto che chiamare il metodo su un oggetto?

Per chiarire cosa intendo, considera la seguente classe:

public class SomeClass {
    private double someValue;

    public SomeClass() {
        // Some constructor in which someValue is set
    }

    public void incrementValue() {
        someValue++;
    }
}

Rispetto a questa implementazione alternativa con un metodo statico:

public class SomeClass {
    private double someValue;

    public SomeClass() {
        // Some constructor in which someValue is set
    }

    public static void incrementValue(SomeClass obj) {
        obj.someValue++;
    }
}

La mia domanda non è limitata a questa classe da solo; qualsiasi punto in cui si passa un oggetto invece di chiamarlo su un metodo è ciò che mi interessa. È mai vantaggioso? Se sì, perché?

    
posta Addison Crump 11.03.2016 - 19:37
fonte

4 risposte

35

Un esempio banale: quando l'istanza passata può essere legittimamente nullo e si desidera incorporare la gestione (non banale) di questo nel metodo.

    
risposta data 11.03.2016 - 19:55
fonte
20

Nel tuo esempio, il metodo di istanza è un chiaro vincitore.

Nel caso generale, posso pensare ad alcuni motivi in cui un metodo statico potrebbe essere appropriato:

  • Vuoi mettere il metodo statico in un'altra classe, dato che hai una situazione in cui ha senso separare la logica dai dati (nota: il tuo esempio non è uno di questi).

  • Stai passando due o più oggetti e vuoi sottolineare che hanno la stessa importanza.

  • null è un valore valido (come spiegato dall'utente 9000).

risposta data 11.03.2016 - 21:46
fonte
6

Sarebbe saggio includere i metodi che cambiano lo stato dell'oggetto come metodo istanza piuttosto che statico .

Tuttavia possiamo trovare esempi di metodi statici che sono metodi pure e prendere l'oggetto come input, come quando abbiamo bisogno di istanziare l'oggetto in base a determinate regole di validazione. Ad esempio, .NET ha il metodo DateTime.TryParse(String s, DateTime d) per convalidare e creare un'istanza dell'oggetto. Ma il parametro DateTime d è esplicitamente contrassegnato come out .

Un altro caso può essere quando si confrontano gli oggetti e si desidera ottenere l'oggetto desiderato come valore di ritorno anziché un valore booleano / intero del risultato del confronto, ad esempio Team.GetHigherScorer(teamA, teamB).IncreaseRanking() . Questo sarà più pulito di:

int compareResult = teamA.compareScoreWith(teamB);
if (compareResult == 1)
    teamA.IncreaseRanking();
else if (compareResult == -1) 
    teamB.IncreaseRanking();

(lasciando il caso "disegnare" per semplicità).

    
risposta data 11.03.2016 - 20:56
fonte
4

L'iniezione di dipendenza sarebbe una buona ragione per eseguire la chiamata al metodo statico. Supponendo che l'implementazione concreta di SomeClass abbia una catena ereditaria o sia l'implementazione di un'altra classe. È possibile utilizzare una simulazione di un oggetto, trasmetterlo a scopo di test per assicurare che il metodo esegua le operazioni previste e quindi generare rapporti su tale stato.

    
risposta data 11.03.2016 - 19:50
fonte

Leggi altre domande sui tag