Frage

Ich begann vor kurzem in Java zu arbeiten und wurde in der wilden und verrückten Welt von Getter und Setter für alles eingeführt. Ich hasste es zunächst, wurde aber schnell daran gewöhnt. Auch daran gewöhnt.

Ich habe viel Zeit verbracht in letzter Zeit mehr über Klasse-Design denken. Eines der Dinge, die ich zu tun versuche, ist die Falle zu tun Getter und Setter für alles zu vermeiden. Aber ein großer Teil der Arbeit, die ich mit Unternehmen zu tun, die in erster Linie Daten-Container sind, und ich bin nicht sicher, dass Getter und Setter in diesen Fällen eigentlich nicht geeignet sind.

Hier ist ein einfaches Beispiel mit dem öffentlichen Eigenschaften.

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

Hier ist ein einfaches Beispiel private Eigenschaften und Verwendung von Getter und Setter verwenden.

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

In diesen Beispielen sowohl die name und die description Felder sollten in der Lage sein, zu ändern.

Ich fühle mich wie die Getter / Setter Beispiel ist klarer und verbirgt die Details der Implementierung, was name und description sind. Es würde auch für die Validierung auf später eingestellt, wenn nötig.

Ich habe mehrere Diskussionen lesen über Getter und Setter sind böse und / oder ein Anti-Muster, aber es fühlt sich wirklich wie diejenigen, die nicht auf diese Situation anwenden können.

Vielleicht gibt es einige Optionen, die ich noch nicht berücksichtigt. Ich bin offen für Vorschläge!

War es hilfreich?

Lösung

Um es einfach:

  • Sie müssen Getter für alle Felder, die von außen gelesen werden müssen.
  • Sie müssen Setter für alle Felder, die von außen geschrieben werden müssen.

Dies kann zu 100%, aber die meiste Zeit ist es weniger.

Andere Tipps

Die erste Version (öffentliche Objekte) ist keine gute Idee. Die zweite ist besser. Als Josh Bloch würde sagen, "zugunsten Unveränderlichkeit"

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

Dass gesagt wird, Getter und Setter sind in der Regel werden überstrapaziert .

Sie gehört haben, die oft stark vereinfacht „get / Setter sind böse“. Niemand (hoffe ich) wirklich bedeutet, dass es für Datenobjekte mit ihm etwas nicht in Ordnung ist. Ich denke, die wirkliche Idee ist:

„Getter / Setter sind böse, mit Ausnahme von Normaldatenspeicherobjekte“, die selbst nur eine Evangelisation von „sagen nicht fragen“.

Im Idealfall, wenn eine Klasse Getter und Setter hat, das ist alle sollte es haben.

Das ist das Argument sowieso. Ich bin mir nicht sicher, ob ich damit einverstanden ist.

Während die Zugriffsmuster der Details der Implementierung einer Klasse helfen verstecken (zum Beispiel unter Verwendung einer Hash-Tabelle zum Speichern von Attributen Speicher auf spärlich verwendete Klassen zu speichern), kann es sehr umfangreich sein zu implementieren (Ihr Beispiel hat 12 Zeilen mehr mit Accessoren). Deshalb C # eine besondere Eigenschaft Syntax, die prägnant ermöglicht Standardzugriffs angeben:

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

Alternative Formen können Zugriffsbezeichner und / oder Code hinzufügen:

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top