Domanda

Inoltre, ci sono vantaggi in termini di prestazioni per i metodi statici rispetto ai metodi di istanza?

Recentemente mi sono imbattuto in quanto segue: http://www.cafeaulait.org/course/week4/22.html :

Quando un metodo dovrebbe essere statico?

  1. Né legge né scrive nei campi di istanza
  2. Indipendente dallo stato dell'oggetto
  3. Metodi matematici che accettano argomenti, applicano un algoritmo a tali argomenti e restituiscono un valore
  4. Metodi di fabbrica che servono al posto dei costruttori

Sarei molto interessato al feedback della community di Stack Overflow a riguardo.

È stato utile?

Soluzione

Rendi statici i metodi quando non fanno parte dell'istanza.Non preoccuparti delle micro-ottimizzazioni.

Potresti scoprire di avere molti metodi privati ​​che potrebbero essere statici ma chiami sempre dai metodi di istanza (o tra loro).In quel caso non ha molta importanza.Tuttavia, se vuoi essere effettivamente in grado di testare il tuo codice e magari usarlo da qualche altra parte, potresti prendere in considerazione l'idea di creare questi metodi statici in una classe diversa, non istanziabile.

Altri suggerimenti

Il fatto che un metodo sia statico o meno è più una considerazione di progettazione che di efficienza.Un metodo statico appartiene a una classe, mentre un metodo non statico appartiene a un oggetto.Se avessi un corso di matematica, potresti avere alcuni metodi statici per gestire addizioni e sottrazioni perché questi sono concetti associati alla matematica.Tuttavia, se avessi una classe Auto, potresti avere alcuni metodi non statici per cambiare marcia e sterzare, perché sono associati a un'auto specifica e non al concetto di auto in generale.

Un altro problema con i metodi statici è che è piuttosto doloroso scrivere test unitari per loro, almeno in Java.Non è possibile deridere in alcun modo un metodo statico.C'è un pubblica un post sul blog di test di Google su questo problema.

La mia regola pratica è scrivere metodi statici solo quando non hanno dipendenze esterne (come accesso al database, lettura di file, e-mail e così via) per mantenerli il più semplici possibile.

@jagmal Penso che tu abbia incrociato dei fili da qualche parte: tutti gli esempi che elenchi chiaramente non sono metodi statici.

I metodi statici dovrebbero occuparsi interamente delle proprietà e dei concetti astratti di una classe: non dovrebbero in alcun modo riguardare attributi specifici dell'istanza (e la maggior parte dei compilatori urlerà se lo fanno).

Per l'esempio dell'auto, la velocità e i km percorsi sono chiaramente correlati agli attributi.Il cambio di marcia e il calcolo della velocità, se considerati a livello di auto, dipendono dagli attributi, ma considera una classe carModel che eredita da car:a questo punto potrebbero diventare metodi statici, poiché gli attributi richiesti (come il diametro della ruota) potrebbero essere definiti come costanti a quel livello.

Ricorda solo che ogni volta che scrivi un metodo statico, stai scrivendo un metodo non flessibile il cui comportamento non può essere modificato molto facilmente.

Stai scrivendo codice procedurale, quindi se ha senso essere procedurale, allora fallo.In caso contrario, probabilmente dovrebbe essere un metodo di istanza.

Questa idea è tratta da un articolo di Steve Yegge, che ritengo sia una lettura interessante e utile.

Dal punto di vista delle prestazioni, un metodo statico C++ può essere leggermente più veloce di un metodo di istanza non virtuale, poiché non è necessario che un puntatore "this" venga passato al metodo.A loro volta, entrambi saranno più veloci dei metodi virtuali poiché non è necessaria la ricerca VMT.

Ma è probabile che sia proprio nel rumore, in particolare per le lingue che consentono di ottimizzare il passaggio di parametri non necessari.

Ecco una discussione correlata a perché String.Format è statico che metterà in evidenza alcune ragioni.

Un'altra cosa da considerare quando si rendono statici i metodi è che chiunque sia in grado di vedere la classe può chiamare un metodo statico.Mentre quando il mehtod è un metodo di istanza, solo coloro che hanno accesso a un'istanza possono chiamare quel metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top