Wie funktionieren Getter und Setter?

107

Ich komme aus der PHP-Welt. Können Sie erklären, was Getter und Setter sind, und einige Beispiele nennen?

Ajsie
quelle
@ yegor256 Ich verstehe Ihre Hund & Ball-Analogie und unterstütze sie sogar, aber was ist, wenn ein Objekt "lebender Organismus" den gelegentlichen primitiven Wert speichert, z. B. eine ID? Was ist, wenn Sie einen Schritt über die einfache Zuweisung hinausgehen möchten, aber keine neue Klasse schreiben möchten, um nur primitive Werte zu verarbeiten?
Jacksonkr

Antworten:

127

Tutorial ist dafür nicht wirklich erforderlich. Informieren Sie sich über die Kapselung

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;
}
Paul Creasey
quelle
11
Getter ist also nur eine Methode, um ein privates Feld abzurufen, und Setter setzt ein neues Feld. danke für die ausgezeichnete Erklärung durch Code
Ajsie
1
Könnten Sie einen Parameter an einen Getter übergeben?
Ajsie
2
noname: Nein und nein. Getter ist eine Möglichkeit, einen Wert abzurufen, aber den in einem Feld enthaltenen Wert NICHT verfügbar zu machen. Wenn Sie ihn aufrufen someObj.getTime().setHour(5), sollte dies keinen Einfluss auf someObjden internen Status haben. Auch Setter und Getter (Accessoren und Mutatoren nach ihrem schickeren Namen) haben eine sehr strenge Methodensignatur, was bedeutet, dass Getter keine Parameter hat. Methoden im Allgemeinen sollten sowieso nur eines tun.
Esko
4
@noname: Wenn einfache Dinge komplexe / große / abstrakte Namen erhalten, haben Sie ein sogenanntes "Entwurfsmuster" .... Und dies ist ein Beispiel für das gerade erfundene Rekursivkonzept-Erklärungsmuster ;-)
Namespaceform
3
@qed: Das thisSchlüsselwort ist optional, es sei denn, es liegt ein Konflikt mit etwas vor, das einen spezifischeren Bereich hat. In dem von Ihnen angegebenen Beispiel verfügt der erstellte Setter über einen einzelnen Parameter, dessen Name mit dem Feldnamen übereinstimmt. Daher this.fieldName = fieldNamewird verwendet, um zu unterscheiden, dass das Feld zugewiesen wird, und nicht, wie der Parameter sich selbst zugewiesen wird, wie fieldName = fieldnamedies erreicht werden würde. Im Getter besteht kein solcher Konflikt.
Paul Creasey
39

In Java sind Getter und Setter ganz normale Funktionen. Das einzige, was sie zu Gettern oder Setzern macht, ist die Konvention. Ein Getter für foo heißt getFoo und der Setter heißt setFoo. Im Falle eines Booleschen Werts heißt der Getter isFoo. Sie müssen auch eine spezifische Deklaration haben, wie in diesem Beispiel eines Getters und Setters für 'name' gezeigt:

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;
    }
}

Der Grund für die Verwendung von Gettern und Setzern, anstatt Ihre Mitglieder öffentlich zu machen, besteht darin, dass es möglich ist, die Implementierung zu ändern, ohne die Schnittstelle zu ändern. Viele Werkzeuge und Toolkits, die Reflexion zum Untersuchen von Objekten verwenden, akzeptieren nur Objekte mit Getter und Setter. JavaBeans müssen beispielsweise Getter und Setter sowie einige andere Anforderungen haben.

Mark Byers
quelle
9
Sollten diese Konstruktoren nicht "nichtig" sein?
Jason Hartley
Leere ist hier eigentlich notwendig. Wenn Sie es nicht haben, erhalten Sie:error: invalid method declaration; return type required
Dan
3
Leere ist hier nicht erforderlich
Shashi Kiran
2
@JasonHartley: Ein Konstruktor hat keinen Rückgabetyp.
Wassimans
@Mark Byers Der Konstruktor wird also zum Initialisieren der Instanz verwendet, und der Setter wird zum Ändern eines bestimmten Attributs verwendet. Ist das richtig?
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);  
 }
}  

Wenn Sie das Programm ausführen, startet das Programm im Netz.

  1. Objekt c wird erstellt
  2. Funktion setTime()wird vom Objekt aufgerufen c
  3. Die Variable timewird auf den übergebenen Wert gesetzt
  4. Funktion getTime()wird vom Objekt c aufgerufen
  5. Die Zeit wird zurückgegeben
  6. Es wird an übergeben todund todausgedruckt
user3137648
quelle
10

Vielleicht möchten Sie auch lesen: " Warum Getter- und Setter-Methoden böse sind ":

Obwohl Getter / Setter-Methoden in Java üblich sind, sind sie nicht besonders objektorientiert (OO). Tatsächlich können sie die Wartbarkeit Ihres Codes beeinträchtigen. Darüber hinaus ist das Vorhandensein zahlreicher Getter- und Setter-Methoden eine rote Fahne, dass das Programm aus OO-Sicht nicht unbedingt gut gestaltet ist.

Dieser Artikel erklärt, warum Sie keine Getter und Setter verwenden sollten (und wann Sie sie verwenden können), und schlägt eine Entwurfsmethode vor, die Ihnen hilft, aus der Getter / Setter-Mentalität auszubrechen.

superfav
quelle
3

1. Die besten Getter / Setter sind schlau.

Hier ist ein Javascript-Beispiel aus 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)

Ich habe diese VIEL benutzt, weil sie fantastisch sind . Ich würde es verwenden, wenn ich Lust auf meine Codierung + Animation habe. Erstellen Sie beispielsweise einen Setter, der sich mit einem Setter befasst, Numberder diese Nummer auf Ihrer Webseite anzeigt. Wenn der Setter verwendet wird, animiert er die alte Nummer mit einem Tweener zur neuen Nummer . Wenn die Anfangszahl 0 ist und Sie sie auf 10 setzen, werden die Zahlen schnell von 0 auf 10 umgedreht, sagen wir eine halbe Sekunde. Benutzer lieben dieses Zeug und es macht Spaß, es zu erstellen.

2. Getter / Setter in PHP

Beispiel aus 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;
  }
}
?>

Zitate:

Jacksonkr
quelle
2

Hier ist ein Beispiel, um die einfachste Art der Verwendung von Getter und Setter in Java zu erklären. Man kann dies auf einfachere Weise tun, aber Getter und Setter haben etwas Besonderes, wenn man ein privates Mitglied der Elternklasse in der Kindklasse in der Vererbung verwendet. Sie können dies durch Verwendung von Getter und Setter ermöglichen.

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();
        }

    }
Bashir ahmad
quelle
Ich werde dich nicht herabstimmen (die Mühe nicht wert). Bitte beachten Sie, dass (1) Sie haben sich auf eine answerred Java Frage, wo die Programmsprache sollte in Java sein. (2) Wenn Sie posten möchten, stellen Sie sicher, dass das Layout korrekt ist. (3) Ihre Verwendung von Kapselung (Getter (oder Accessor) und Setter (oder Mutatoren)) ist falsch. Bitte schauen Sie nach, was Kapselung bedeutet ... (Überprüfen Sie die abgestimmte Antwort)
KarelG
1
@KarelG Entschuldigung, ich habe die Tags nicht gelesen. Ich habe es auf Java aktualisiert. Danke, dass du mich erkannt hast.
Bashir Ahmad