it-swarm.com.de

Methoden in Java setzen und holen?

Wie kann ich set and get-Methoden verwenden und warum sollte ich sie verwenden? Sind sie wirklich hilfreich? Und können Sie mir auch Beispiele für set and get-Methoden geben?

47
user759630

Set- und Get-Methoden sind ein Muster der Datenkapselung. Anstatt direkt auf Klassenmitgliedervariablen zuzugreifen, definieren Sie get Methoden, um auf diese Variablen zuzugreifen, und set Methoden, um sie zu ändern. Wenn Sie sie auf diese Weise einkapseln, haben Sie die Kontrolle über die öffentliche Schnittstelle, falls Sie in Zukunft das Innenleben der Klasse ändern müssen.

Zum Beispiel für eine Mitgliedsvariable:

Integer x;

Sie könnten Methoden haben:

Integer getX(){ return x; }
void setX(Integer x){ this.x = x; }

chiccodoro erwähnte auch einen wichtigen Punkt. Wenn Sie nur Lesezugriff auf das Feld für fremde Klassen zulassen möchten, können Sie dies tun, indem Sie nur eine öffentliche get -Methode angeben und set privat halten oder set überhaupt.

54
Justin Ethier

Ich möchte zu anderen Antworten hinzufügen, dass Setter verwendet werden können, um zu verhindern, dass das Objekt in einen ungültigen Zustand versetzt wird.

Nehmen wir zum Beispiel an, dass ich eine TaxId festlegen muss, die als String modelliert ist. Die erste Version des Setters kann wie folgt lauten:

private String taxId;

public void setTaxId(String taxId) {
    this.taxId = taxId;
}

Wir sollten jedoch besser verhindern, dass das Objekt mit einer ungültigen taxId gesetzt wird, damit wir eine Prüfung einführen können:

private String taxId;

public void setTaxId(String taxId) throws IllegalArgumentException {
    if (isTaxIdValid(taxId)) {
        throw new IllegalArgumentException("Tax Id '" + taxId + "' is invalid");
    }
    this.taxId = taxId;
}

Der nächste Schritt, um die Modularität des Programms zu verbessern, besteht darin, die TaxId selbst als ein Objekt zu definieren, das in der Lage ist, sich selbst zu überprüfen.

private final TaxId taxId = new TaxId()

public void setTaxId(String taxIdString) throws IllegalArgumentException {
    taxId.set(taxIdString); //will throw exception if not valid
}

Ähnliches gilt für den Getter, wenn wir noch keinen Wert haben. Vielleicht wollen wir einen anderen Weg gehen, wir könnten sagen:

public String getTaxId() throws IllegalStateException {
    return taxId.get(); //will throw exception if not set
}
22
stivlo

Ich denke du willst so etwas:

public class Person {

  private int age;

  //public method to get the age variable
  public int getAge(){
       return this.age
  }

  //public method to set the age variable
  public void setAge(int age){
       this.age = age;
  }
}

Sie rufen einfach eine solche Methode für eine Objektinstanz auf. Solche Methoden sind besonders dann nützlich, wenn die Einstellung von etwas Nebenwirkungen haben soll. Z.B. wenn du auf bestimmte ereignisse reagieren willst wie:

  public void setAge(int age){

       this.age = age;

       double averageCigarettesPerYear = this.smokedCigarettes * 1.0 / age;

       if(averageCigarettesPerYear >= 7300.0) {
           this.eventBus.fire(new PersonSmokesTooMuchEvent(this));
       }
  }

Dies kann natürlich gefährlich sein, wenn jemand vergisst, setAge(int) dort aufzurufen, wo er soll, und age direkt mit this.age Setzt.

8
displayname

Zugriffsmethoden sind dem direkten Zugriff auf Felder vorzuziehen, da sie steuern, wie auf Felder zugegriffen wird (dies kann eine Datenprüfung erforderlich machen usw.) und zu Schnittstellen passen (für Schnittstellen müssen keine Felder vorhanden sein, sondern nur Methoden).

6
Bohemian

Setter und Getter werden verwendet, um den direkten Zugriff auf Membervariablen aus externen Klassen zu ersetzen. Wenn Sie beim Zugriff auf eine Eigenschaft einen Setter und Getter verwenden, können Sie Initialisierung, Fehlerprüfung, komplexe Transformationen usw. einschließen. Einige Beispiele:

private String x;

public void setX(String newX) {
    if (newX == null) {
        x = "";
    } else {
        x = newX;
    }
}

public String getX() {
    if (x == null) {
        return "";
    } else {
       return x;
    }
}
5
g051051

Einige Vorteile der Verwendung von Gettern und Setzern (bekannt als encapsulation oder data-hiding):

(ursprünglich beantwortet hier )

1. Die Felder einer Klasse können schreibgeschützt (indem nur der Getter angegeben wird) oder schreibgeschützt (indem nur der Setter angegeben wird) sein. Dies gibt der Klasse die totale Kontrolle darüber, wer auf ihre Felder zugreifen/diese ändern darf.

Beispiel:

class EncapsulationExample {
    private int readOnly = -1;  // this value can only be read, not altered
    private int writeOnly = 0;    // this value can only be changed, not viewed
    public int getReadOnly() {
        return readOnly;
    }
    public int setWriteOnly(int w) {
        writeOnly = w;
    }
}

2. Die Benutzer einer Klasse müssen nicht wissen, wie die Klasse die Daten tatsächlich speichert. Dies bedeutet, dass die Daten getrennt und unabhängig von den Benutzern vorhanden sind, sodass der Code einfacher geändert und gepflegt werden kann. Dies ermöglicht den Betreuern, häufige Änderungen wie Fehlerbehebungen, Design- und Leistungsverbesserungen vorzunehmen, ohne die Benutzer zu beeinträchtigen.

Darüber hinaus sind gekapselte Ressourcen für jeden Benutzer einheitlich zugänglich und verhalten sich unabhängig vom Benutzer identisch, da dieses Verhalten in der Klasse intern definiert ist.

Beispiel (einen Wert erhalten):

class EncapsulationExample {
    private int value;
    public int getValue() {     
        return value; // return the value
    }
}

Was ist, wenn ich stattdessen den doppelten Wert zurückgeben möchte? Ich kann einfach meinen Getter ändern und der gesamte Code, der mein Beispiel verwendet, muss nicht geändert werden und wird den doppelten Wert erhalten:

class EncapsulationExample {
    private int value;
    public int getValue() {
        return value*2; // return twice the value
    }
}

3. Macht den Code übersichtlicher, lesbarer und verständlicher.

Hier ist ein Beispiel:

Keine Kapselung:

class Box {
    int widthS; // width of the side
    int widthT; // width of the top
    // other stuff
}

// ...
Box b = new Box();
int w1 = b.widthS;  // Hm... what is widthS again? 
int w2 = b.widthT;  // Don't mistake the names. I should make sure I use the proper variable here!

Mit Einkapselung:

class Box {
    private int widthS; // width of the side
    private int widthT; // width of the top
    public int getSideWidth() {
        return widthS;
    }
    public int getTopWIdth() {
        return widthT;
    }
    // other stuff
}

// ...
Box b = new Box();
int w1 = b.getSideWidth(); // Ok, this one gives me the width of the side
int w2 = b.getTopWidth(); // and this one gives me the width of the top. No confusion, whew!

Sehen Sie sich an, wie viel mehr Kontrolle Sie über die Informationen haben, die Sie erhalten, und wie viel klarer dies im zweiten Beispiel ist. Wohlgemerkt, dieses Beispiel ist trivial und im wirklichen Leben die Klassen, mit denen Sie es zu tun haben würden, wenn viele verschiedene Komponenten auf viele Ressourcen zugreifen würden. Durch die Verkapselung der Ressourcen wird somit klarer, auf welche Ressourcen wir zugreifen und auf welche Weise (Abrufen oder Festlegen).

Hier ist good SO thread zu diesem Thema.

Hier ist good read zur Datenkapselung.

4
nem035

Die obigen Antworten fassen die Rolle von Gettern und Setzern besser als ich zusammen, ich wollte jedoch hinzufügen, dass Ihr Code idealerweise so strukturiert sein sollte, dass die Verwendung von reinen Gettern und Setzern, dh solchen ohne komplexe Konstruktionen, Validierung usw., reduziert wird. wie sie Kapselung brechen. Dies bedeutet nicht, dass Sie sie niemals verwenden können (die Antwort von stivlo zeigt ein Beispiel für eine gute Verwendung von Gettern und Setzern). Versuchen Sie nur, die Häufigkeit ihrer Verwendung zu minimieren.

Das Problem ist, dass Getter und Setter als Problemumgehung für den direkten Zugriff auf private Daten fungieren können. Private Daten werden als privat bezeichnet, da sie nicht für andere Objekte freigegeben werden sollen. Es ist als Repräsentation des Objektzustands gedacht. Wenn Sie anderen Objekten erlauben, auf die privaten Felder eines Objekts zuzugreifen, wird der gesamte Zweck, es privat zu machen, zunichte gemacht. Außerdem führen Sie die Kopplung für jeden Getter oder Setter ein, den Sie schreiben. Betrachten Sie dies zum Beispiel:

private String foo;

public void setFoo(String bar) {
    this.foo = bar;
}

Was passiert, wenn Sie irgendwo auf der Straße entscheiden, dass Sie foo nicht mehr benötigen oder eine Ganzzahl daraus machen möchten? Jedes Objekt, das die setFoo-Methode verwendet, muss jetzt zusammen mit foo geändert werden.

2
xobicvap

nur weil die OOP Regel: Ausblenden und Einkapseln von Daten. Es ist eine sehr schlechte Praxis, ein Objekt als öffentlich zu deklarieren und es in den meisten Situationen sofort zu ändern. Es gibt auch viele andere Gründe, aber Die Wurzel ist Encapsulation in OOP. Wenn Sie "ein Buch kaufen oder über objektorientierte Programmierung lesen", werden Sie alles darüber verstehen, nachdem Sie ein Buch über OOP gelesen haben.

2
Ben Xu
public class Person{

private int age;

public int getAge(){
     return age;
}

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

ich denke das ist was du willst .. und das nennt man auch pojo

1
subash

Die obigen Antworten setzen alle voraus, dass das betreffende Objekt ein Objekt mit Verhalten ist. Eine erweiterte Strategie in OOP) besteht darin, Datenobjekte (die Zip ausführen und nur Felder enthalten) und Verhaltensobjekte zu trennen.

Bei Datenobjekten ist es vollkommen in Ordnung, Getter wegzulassen und stattdessen öffentliche Felder zu haben. Sie haben normalerweise keine Setter, da sie meist unveränderlich sind - ihre Felder werden über die Konstruktoren festgelegt und nie wieder. Schauen Sie sich Bob Martins Clean Code oder Pryce and Freeman's Growing OO Software ... für Details an.

1
Urs Reupke

Die Vorteile der get () set () -Methoden sind folgende:.

  1. Sie können Ihr Objekt einfach serialisieren.
  2. Sie können ein persistentes Objekt aus der enthaltenden Klasse erstellen.
  3. Sie können die Eigenschaften einfach in JSON konvertieren.
  4. In der DAO-Ebene (Frameworks wie Hibernate) können Sie das Objekt direkt in der Datenbank speichern.
  5. Einfaches Verständnis des objektorientierten Konzepts.
  6. Erfordert in allen Entwurfsmustern außer möglicherweise im einzelnen Tonmuster.
  7. Sicherheit für Eigenschaften, die den direkten Zugriff schützen.
  8. Polymorphismus, Verkapselung kann von dieser Art von Klasse leicht verstanden und implementiert werden.

Beispiel:

private String personName;
private int personId;

    public void setPersonName(String name) throws Exception{
    if(!(name.equals("")||name=="")){
      this.personName = name;
    }
  }
  public String getPersonName(){
    return this.personName;
  }
  public void setPersonId(int id) throws Exception{
    this.personId = id;
  }
  public int getPersonId(){
    return this.personId;
  }
1
Kaisar

Diese Antwort wird aus einer anderen Frage zusammengeführt.

Ihre getAge() -Methode wird in Java als Instanzmethode bezeichnet.

Um eine Instanzmethode aufzurufen, sollten Sie ein Objekt der Klasse haben, in der diese Methode definiert ist.

Zum Beispiel, wenn diese Methode in einer Klasse Person heißt, dann

  1. Erstellen Sie ein Personenobjekt mit dem Operator new

     Person p = new Person();
    
  2. Verwenden Sie diese Methode, um das Alter eines Person -Objekts zu ermitteln

    p.getAge()
    
0

dies ist der Code für die Set-Methode

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

Es sieht so aus, als würden Sie versuchen, etwas Ähnliches wie C # zu tun, wenn Sie die Methode setAge create möchten
setAge(int age){ this.age = age;}

0
user3455363

Ich sehe hier keine einfache Antwort auf die zweite Frage (warum). Also geht es los.

Angenommen, Sie haben ein öffentliches Feld, das in Ihrem Code sehr häufig verwendet wird. Wann immer Sie sich entscheiden, etwas extra zu tun, bevor Sie dieses Feld angeben oder setzen, haben Sie ein Problem. Sie müssen einen speziellen Getter und Setter für dieses Feld erstellen und Ihren gesamten Code von der direkten Verwendung des Felds zur Verwendung des Getter und Setters ändern.

Stellen Sie sich nun vor, Sie entwickeln eine Bibliothek, die von vielen Menschen genutzt wird. Wenn Sie eine Änderung wie oben vornehmen und den direkten Zugriff auf das Feld auf privat einstellen müssen, wird der Code aller Personen, die dieses Feld verwenden, unterbrochen.

Bei der Verwendung von Gettern und Setzern geht es um die zukünftige Planung des Codes, da dieser flexibler wird. Natürlich können Sie öffentliche Felder verwenden, insbesondere für einfache Klassen, die nur einige Daten enthalten. Es ist jedoch immer eine gute Idee, das Feld privat zu machen und eine Methode zum Abrufen und Festlegen zu programmieren.

0
Madmenyo