Suche…


Einführung

Dieser Artikel beschreibt Getter und Setter. die Standardmethode für den Zugriff auf Daten in Java-Klassen.

Getter und Setter hinzufügen

Die Kapselung ist ein grundlegendes Konzept in OOP. Es geht darum, Daten und Code als einzelne Einheit zu verpacken. In diesem Fall empfiehlt es sich, die Variablen als private zu deklarieren und dann über Getters und Setters darauf zuzugreifen, um sie anzuzeigen und / oder zu ändern.

public class Sample {
  private String  name;
  private int age;

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

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

Auf diese privaten Variablen kann nicht direkt von außerhalb der Klasse zugegriffen werden. Sie sind somit vor unbefugtem Zugriff geschützt. Wenn Sie sie jedoch anzeigen oder ändern möchten, können Sie Getter und Setter verwenden.

getXxx() -Methode gibt den aktuellen Wert der Variablen xxx , während Sie den Wert der Variablen xxx mit setXxx() .

Die Namenskonvention der Methoden lautet (in Beispielvariable heißt variableName ):

  • Alle nicht boolean Variablen

     getVariableName()   //Getter, The variable name should start with uppercase
     setVariableName(..) //Setter, The variable name should start with uppercase
    
  • boolean Variablen

      isVariableName()     //Getter, The variable name should start with uppercase
      setVariableName(...) //Setter, The variable name should start with uppercase
    

Öffentliche Getter und Setter sind Teil der Property- Definition eines Java-Beans.

Verwenden eines Setter oder Getter zum Implementieren einer Einschränkung

Setter und Getter ermöglichen, dass ein Objekt private Variablen enthält, auf die mit Einschränkungen zugegriffen und diese geändert werden können. Zum Beispiel,

public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name!=null && name.length()>2)
           this.name = name;
    }
}

In dieser Person Klasse gibt es eine einzige Variable: name . Auf diese Variable kann mit der Methode getName() zugegriffen und mit der Methode setName(String) geändert werden. setName(String) jedoch einen Namen setName(String) , muss der neue Name setName(String) als 2 Zeichen sein und darf nicht null sein. Eine Setter - Methode anstatt macht die variablen name Öffentlichkeit andere ermöglicht , den Wert zu setzen name mit gewissen Einschränkungen. Dasselbe kann auf die Getter-Methode angewendet werden:

public String getName(){
   if(name.length()>16)
      return "Name is too large!";
   else
      return name;
}

In der modifizierten getName() -Methode oben wird der name nur zurückgegeben, wenn seine Länge kleiner oder gleich 16 ist. Andernfalls wird "Name is too large" zurückgegeben. Dies ermöglicht dem Programmierer das Erstellen von Variablen, die beliebig erreichbar und modifizierbar sind, und verhindert, dass Client-Klassen die Variablen ungewollt bearbeiten.

Warum verwenden Sie Getter und Setter?

Betrachten Sie eine Basisklasse, die ein Objekt mit Gettern und Setters in Java enthält:

public class CountHolder {
  private int count = 0;

  public int getCount() { return count; }
  public void setCount(int c) { count = c; }
}

Wir können nicht auf die count Variable zugreifen, weil sie privat ist. Wir können jedoch auf die getCount() und setCount(int) , da sie öffentlich sind. Für einige könnte dies die Frage aufwerfen; warum den Mittelsmann vorstellen? Warum machen Sie sie nicht einfach öffentlich?

public class CountHolder {
  public int count = 0;
}

In jeder Hinsicht sind diese beiden Funktionen in Bezug auf die Funktionalität identisch. Der Unterschied zwischen ihnen ist die Erweiterbarkeit. Überlegen Sie, was jede Klasse sagt:

  • Erstens : "Ich habe eine Methode, die Ihnen einen int Wert gibt, und eine Methode, die diesen Wert auf einen anderen int ".
  • Zweitens : "Ich habe ein int , das Sie einstellen und erhalten können, wie Sie möchten."

Diese klingen vielleicht ähnlich, aber die erste ist in ihrer Natur viel mehr bewacht. Es lässt Sie nur mit seiner inneren Natur interagieren, während es diktiert. Der Ball bleibt auf seinem Platz. Es entscheidet, wie die internen Interaktionen stattfinden. Die zweite hat seine interne Implementierung von außen ausgesetzt ist , und ist nun nicht nur anfällig für externe Benutzer, aber im Fall einer API, die mich zu , dass die Umsetzung aufrechterhalten (oder auf andere Weise ein nicht-rückwärtskompatible API Freigabe).

Überlegen wir, ob wir den Zugriff synchronisieren möchten, um die Zählung zu ändern und darauf zuzugreifen. Im ersten ist das einfach:

public class CountHolder {
  private int count = 0;

  public synchronized int getCount() { return count; }
  public synchronized void setCount(int c) { count = c; }
}

aber im zweiten Beispiel, das ist jetzt fast unmöglich , ohne durch zu gehen und Modifizieren jeden Ort , an dem die count referenziert wird. Schlimmer noch, wenn dies ein Element, das Sie in einer Bibliothek sind die Bereitstellung von anderen verbraucht werden, müssen Sie nicht auf eine Art und Weise , dass die Modifikation der Durchführung, und die harte Wahl oben erwähnt machen gezwungen.

So stellt sich die Frage; sind öffentliche Variablen immer eine gute Sache (oder zumindest nicht böse)?

Ich bin mir nicht sicher Auf der einen Seite sehen Sie Beispiele für öffentliche Variablen, die sich bewährt haben (IE: die out Variable, auf die in System.out verwiesen wird). Andererseits bietet die Bereitstellung einer öffentlichen Variablen keinen Vorteil außerhalb eines extrem geringen Overheads und einer möglichen Verringerung der Wortlautstärke. Meine Leitlinie hier wäre, wenn Sie vorhaben, eine Variable öffentlich zu machen, sollten Sie sie anhand dieser Kriterien mit extremen Vorurteilen beurteilen:

  1. Die Variable sollte keinen Grund haben, ihre Implementierung jemals zu ändern. Dies ist etwas, das extrem einfach zu vermasseln ist (und selbst wenn Sie es richtig machen, können sich die Anforderungen ändern). Wenn Sie über eine öffentliche Variable verfügen, muss dies wirklich durchdacht werden, insbesondere wenn sie in einer Library / Framework / API veröffentlicht wird.
  2. Die Variable muss so häufig referenziert werden, dass die minimalen Gewinne durch die Reduzierung der Ausführlichkeit dies rechtfertigen. Ich denke nicht, dass der Aufwand für die Verwendung einer Methode im Vergleich zur direkten Referenzierung hier berücksichtigt werden sollte. Es ist viel zu vernachlässigbar für das, was ich zu 99,9% der Bewerbungen schätzen würde.

Wahrscheinlich gibt es mehr, als ich mir überlegt habe. Wenn Sie jemals Zweifel haben, verwenden Sie immer Getter / Setter.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow