Come funzionano getter e setter?


107

Vengo dal mondo php. Potresti spiegare cosa sono getter e setter e potresti fornire alcuni esempi?


@ yegor256 Capisco la tua analogia dog & ball e la sostengo anche, ma cosa succede quando un oggetto "organismo vivente" memorizza il valore primitivo occasionale, ad esempio un ID? E se volessi fare un passo oltre il semplice compito ma non vuoi scrivere una nuova classe solo per gestire i valori primitivi?
Jacksonkr

Risposte:


127

Il tutorial non è realmente richiesto per questo. Leggi su incapsulamento

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
quindi getter è solo un metodo per ottenere un campo privato e setter sta impostando un nuovo campo. grazie per l'eccellente spiegazione in codice
ajsie

1
potresti passare un parametro a un getter?
ajsie

2
noname: No e no. Getter è un modo per ottenere un valore ma NON esporre il valore contenuto in un campo, cioè se lo chiami someObj.getTime().setHour(5)non dovrebbe influenzare lo someObjstato interno di. Anche setter e getter (accessors e mutator con il loro nome più elaborato) hanno una firma del metodo molto rigorosa, il che significa che getter non ha parametri. I metodi in generale dovrebbero comunque fare solo una cosa.
Esko

4
@noname: Quando a cose semplici vengono dati nomi complessi / grandi / astratti, hai quello che viene chiamato "design pattern" .... E questo è un esempio del modello di spiegazione del concetto ricorsivo che ho appena inventato ;-)
namespaceform

3
@qed: la thisparola chiave è facoltativa a meno che non vi sia un conflitto con qualcosa che ha un ambito più specifico. Nell'esempio che hai fornito, il setter che viene creato avrà un singolo parametro il cui nome corrisponde al nome del campo, quindi this.fieldName = fieldName, viene utilizzato per distinguere che il campo viene assegnato piuttosto che il parametro che viene assegnato a se stesso come si fieldName = fieldnameotterrebbe. Nessun conflitto di questo tipo esiste nel getter.
Paul Creasey

39

In Java getter e setter sono funzioni completamente ordinarie. L'unica cosa che li rende getter o setter è la convenzione. Un getter per foo si chiama getFoo e il setter si chiama setFoo. Nel caso di un booleano, il getter è chiamato isFoo. Devono anche avere una dichiarazione specifica come mostrato in questo esempio di un getter e setter per 'name':

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Il motivo per utilizzare getter e setter invece di rendere pubblici i propri membri è che rende possibile modificare l'implementazione senza modificare l'interfaccia. Inoltre, molti strumenti e toolkit che usano la riflessione per esaminare gli oggetti accettano solo oggetti che hanno getter e setter. I JavaBeans, ad esempio, devono avere getter e setter oltre ad alcuni altri requisiti.


9
Quei costruttori non dovrebbero avere "vuoto"?
Jason Hartley

Il vuoto è effettivamente necessario qui. Se non ce l'hai ottieni:error: invalid method declaration; return type required
Dan

3
Il vuoto non è richiesto qui
Shashi Kiran

2
@ JasonHartley: un costruttore non ha un tipo di ritorno.
wassimans

@Mark Byers Quindi, il costruttore viene utilizzato per inizializzare l'istanza e il setter viene utilizzato per modificare qualsiasi attributo dato. È corretto?
carloswm85

12
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

Quando si esegue il programma, il programma si avvia in rete,

  1. viene creato l'oggetto c
  2. la funzione setTime()è chiamata dall'oggetto c
  3. la variabile timeè impostata al valore passato da
  4. la funzione getTime()è chiamata dall'oggetto c
  5. l'ora viene restituita
  6. Passerà tode todverrà stampato

10

Potresti anche leggere " Perché i metodi getter e setter sono malvagi ":

Sebbene i metodi getter / setter siano comuni in Java, non sono particolarmente orientati agli oggetti (OO). In effetti, possono danneggiare la manutenibilità del codice. Inoltre, la presenza di numerosi metodi getter e setter è una bandiera rossa che il programma non è necessariamente ben progettato da una prospettiva OO.

Questo articolo spiega perché non dovresti usare getter e setter (e quando puoi usarli) e suggerisce una metodologia di progettazione che ti aiuterà a uscire dalla mentalità getter / setter.


3

1. I migliori getter / setter sono intelligenti.

Ecco un esempio di javascript da mozilla:

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.a + 1; 
    } 
});

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

Li ho usati MOLTO perché sono fantastici . Lo userei quando mi diverto con la mia codifica + animazione. Ad esempio, crea un setter che si occupi di un Numbernumero che mostra quel numero sulla tua pagina web. Quando viene utilizzato il setter, anima il vecchio numero con il nuovo numero utilizzando un tweener . Se il numero iniziale è 0 e lo imposti a 10, vedresti i numeri passare rapidamente da 0 a 10, diciamo, mezzo secondo. Gli utenti adorano questa roba ed è divertente da creare.

2. Getters / setters in php

Esempio da sof

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

citings:


2

Ecco un esempio per spiegare il modo più semplice di usare getter e setter in java. Si può farlo in un modo più diretto, ma getter e setter hanno qualcosa di speciale che è quando si utilizza un membro privato della classe genitore nella classe figlia nell'ereditarietà. Puoi renderlo possibile usando getter e setter.

package stackoverflow;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

Non ho intenzione di sottovalutarti (non ne vale la pena). Tieni presente che (1) hai risposto a una domanda su Java , dove il linguaggio del programma dovrebbe essere in Java. (2) Se vuoi pubblicare, assicurati che il layout sia fatto correttamente. (3) Il tuo uso dell'incapsulamento (getter (o accessorio) e setter (o mutatori)) non è corretto. Per favore controlla cosa significa incapsulamento ... (Controlla la risposta votata)
KarelG

1
@KarelG mi dispiace non ho letto i tag. l'ho aggiornato a java. grazie per avermi realizzato.
Bashir ahmad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.