Domanda

Se hai una classe con alcune semplici proprietà get / set, c'è qualche motivo per usare i getter all'interno dei metodi della classe, o dovresti semplicemente usare le variabili del membro privato? Penso che ci potrebbe essere più di una discussione sui setter (logica di validazione?), Ma mi chiedo solo dei getter.

Ad esempio (in Java) - c'è qualche motivo per usare l'opzione 2 ?:

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
È stato utile?

Soluzione

I programmatori Java in generale tendono ad essere molto coerenti sull'uso dei metodi getter. Programma più lingue e non sono così coerente al riguardo;)

Direi che fintanto che non fai un getter, va bene usare la variabile raw - per le variabili private . Quando fai un getter, dovresti usare solo quello. Quando realizzo un getter per un campo privato, il mio IDE suggerisce che sostituisca automaticamente gli accessi ai campi non elaborati quando introduco un getter. Il passaggio all'utilizzo di un getter richiede solo alcune sequenze di tasti (e senza alcuna possibilità di introdurre errori), quindi tendo a ritardarlo fino a quando non ne ho bisogno.

Ovviamente, se vuoi cose come getter-injection, alcuni tipi di framwork di proxy e sottoclasse come l'ibernazione, devi usare i getter!

Altri suggerimenti

Con i getter non modificherai accidentalmente le variabili :) Inoltre, se utilizzi sia i getter che il "raw" variabile, il tuo codice può essere confuso.

Inoltre, se usi l'ereditarietà e hai ridefinito i metodi getter nelle classi figlio, i metodi che usano getter funzioneranno correttamente, mentre quelli che usano le variabili grezze no.

Se usi il metodo getter ovunque - e in futuro esegui una ricerca di codice su tutte le chiamate di getMessageId () troverai tutte, mentre se avessi usato quelle private, potresti perderne alcune.

Inoltre, se nel metodo setter è stata introdotta la logica, non dovrai preoccuparti di cambiare più di 1 posizione per essa.

Se il valore che si sta assegnando alla proprietà è un valore noto o verificato, è possibile utilizzare direttamente la variabile privata in modo sicuro. (Tranne forse in alcune situazioni speciali, in cui sarebbe ovvio il motivo per cui sarebbe un male.) Se lo fai o no è più una questione di gusti o di stile. Non è nemmeno un problema di prestazioni, poiché il compilatore o il setter saranno indicati dal compilatore se è abbastanza semplice.

Se il valore è sconosciuto alla classe, è necessario utilizzare la proprietà per impostarla, in modo da poter proteggere la proprietà da valori illegali.

Ecco un esempio (in C #):

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}

Se usi il getter stai assicurando che otterrai il valore dopo aver applicato qualsiasi logica / decisione. Questa probabilmente non è la tua situazione tipica, ma quando lo è, ti ringrazierai per questo.

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