2013-04-18 14 views
5

Immaginate Ho una classe con un membro di istanzaPassare le variabili di istanza ai metodi di istanza e accedervi direttamente?

String instanceMember; 

Inoltre ho come 4 metodi di istanza di accesso a questo utente. Ora mi chiedo se esiste un vero pro/con per accedere direttamente al membro dell'istanza dai metodi dell'istanza o per passare il membro dell'istanza come parametro a ciascuno dei metodi dell'istanza?

+0

Fondamentalmente, ciò che "sembra giusto". A volte è una buona idea passare il riferimento, proprio come una sorta di "documentazione" su cui stai operando. (Ma non abbiate paura di tornare indietro e modificare uno schema di parm passando se comincia a sembrare sbagliato - molte atrocità sono commesse nel nome di evitare cambiamenti (banali).) –

risposta

0

Se questi metodi sono metodi pubblici che manipolano lo stato di una variabile membro permanente, non è necessario passarla in giro. Ad esempio, se si deve fare qualcosa come il seguente, si dovrebbe probabilmente essere manipolato direttamente con il metodo invece di essere passato in:

myObject.SomeMethod(myObject.instanceMember, 15); 

Questo in realtà dovrebbe essere solo:

myObject.SomeMethod(15); 

Se si tratta di qualcosa che potrebbe cambiare per chiamata (ad esempio, il misterioso 15 nel metodo sopra), ti consigliamo di passarlo.

6

Passare il valore come parametro implicherebbe che si eseguirà il calcolo con il valore del parametro anziché con il valore incapsulato.

Se si intende operare su dati incapsulati, non c'è motivo di averlo come parametro.

1

La ragione per avere esempio variabili, in primo luogo è quello di evitare di passarli come parametri: il metodo esempio arriva ad accedervi "gratis", perché sono già nel campo di applicazione del metodo.

ci sono due ragioni per passare variabili di istanza a metodi, però:

  • il metodo è static - metodi di classe non possono accedere variabili di istanza, quindi è necessario passare esplicitamente, o passare l'oggetto su su cui operare
  • È necessario utilizzare la semantica del valore passante - in altre parole, si desidera modificare il valore passato e si desidera evitare di creare una variabile locale. Questo è spesso il caso in cui il metodo è ricorsivo.

Se vi trovate a scrivere codice ricorsivo che modifica un parametro che ha cominciato da una variabile di istanza, in molti casi può essere una buona idea per rendere il vostro metodo di private static, e aggiungere un metodo public esempio per avviare il ricorsiva catena e per raccogliere i risultati.

+1

In questo secondo caso non state tecnicamente passando la variabile di istanza . –

+0

@HotLicks Buon punto, grazie! Ho aggiunto una discussione in basso per approfondire cosa fare nel secondo caso. – dasblinkenlight

+0

Penso che la cosa "semantica pass-by-value" si confonda quando parli di oggetti. Passando un riferimento oggetto nel metodo, vs lasciando che il metodo faccia riferimento all'istanza var, non si modifica il fatto che la modifica dell'oggetto avrà un effetto globale. Questa zona è quella in cui i neofiti vengono seriamente confusi a volte. –

0

Dipenderà molto da come lo si utilizza. Se l'uso della tua classe è raro, allora non ci sarà alcuna differenza evidente.

Se si utilizza molto l'istanza di classe e molti thread, in alcune condizioni, il passaggio come parametro funzionerebbe un po 'più velocemente.

Solitamente ai membri della classe si accede direttamente ai membri dell'istanza con l'eccezione delle funzioni statiche (per ovvi motivi).

Quindi segui le convenzioni di codifica e non preoccuparti. Per quando sarà davvero importante, conoscerai la risposta a memoria.

Problemi correlati