Richtlinien zur Verwendung von Java-Schnittstelle - Sind Getter und Setter in einer Schnittstelle schlecht?

StackOverflow https://stackoverflow.com/questions/1130294

Frage

Was denken die Leute der besten Richtlinien in einer Schnittstelle zu benutzen? Was sollte und nicht in eine Schnittstelle gehen?

Ich habe gehört, wie Leute sagen, dass, als eine allgemeine Regel, muss eine Schnittstelle nur das Verhalten und nicht Zustand definieren. Bedeutet dies, dass eine Schnittstelle sollte nicht Getter und Setter enthalten?

Meine Meinung: Vielleicht nicht so für Einrichter, aber manchmal denke ich, dass Getter gültig ist in einer Schnittstelle platziert werden. Dies ist lediglich die Implementierungsklassen zu erzwingen diese Getter zu implementieren und so zu zeigen, dass die Kunden in der Lage sind, diese Getter zu rufen, etwas zu überprüfen, zum Beispiel.

War es hilfreich?

Lösung

Ich denke, dass es zwei Arten von Schnittstellen im Allgemeinen erklärt:

  1. Service-Beschreibung . Dies könnte so etwas wie CalculationService sein. Ich glaube nicht, dass Methoden getX in dieser Art Schnittstelle sein soll, und sicher nicht setX. Sie ganz klar Implementierung Detail bedeuten, die nicht die Aufgabe dieser Art der Schnittstelle ist.
  2. Datenmodell - existiert nur auf abstrakten die Implementierung von Datenobjekten im System aus. Diese könnten verwendet werden, bei der Prüfung unterstützen oder einfach nur, weil einige Leute so alt wie ich die Tage erinnern, wenn (zum Beispiel) einen Persistenz-Framework gebunden Sie bis zu einem bestimmten superclasss (dh würden Sie wählen eine Schnittstelle für den Fall implementieren Sie geschaltet Ihre Persistenz-Schicht). Ich denke, dass in dieser Art von Schnittstelle JavaBean-Methoden, die ist ganz vernünftig.

Hinweis: die Sammlungen Klassen passen wahrscheinlich # 2

eingeben

Andere Tipps

Ich sehe nicht, warum eine Schnittstelle nicht Getter und Setter definieren kann. Zum Beispiel ist List.size() effektiv ein Getter. Die Schnittstelle muss das Verhalten definieren, anstatt die Implementierung obwohl - es kann nicht sagen, wie Sie behandeln den Zustand, aber es kann darauf bestehen, dass Sie es bekommen können und setzen es.

Sammlung Schnittstellen sind alle über Zustand, zum Beispiel -. Aber verschiedene Sammlungen, diesen Zustand in radikal unterschiedliche Weise speichern

EDIT: Die Kommentare deuten darauf hin, dass Getter und Setter implizieren ein einfaches Feld für die Sicherung Speicher verwendet wird. Ich bin nicht einverstanden mit dieser vehement Implikation. Meiner Meinung nach ist es eine Implikation, dass es „ziemlich billig“, um den Wert zu erhalten / Set, aber nicht, dass es mit einem trivialen Implementierung als ein Feld gespeichert wird.


EDIT: Wie in den Kommentaren erwähnt, ist dies in der


Wenn die angebliche Verwicklung waren wahr, könnten wir genauso gut aussetzen Eigenschaften wie Felder direkt. Zum Glück, dass Implikation nicht halten. Getter und Setter sind perfekt in ihrem Rechtsen Dinge zu berechnen

Betrachten wir zum Beispiel eine Komponente mit

getWidth()
getHeight()
getSize()

Glauben Sie, es gibt eine Implikation, dass es drei Variablen gibt? Wäre es nicht sinnvoll sein, um entweder:

private int width;
private int height;

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}

public Size getSize() {
    return new Size(width, height); // Assuming an immutable Size type
}

oder (vorzugsweise IMO):

private Size size;

public int getWidth() {
    return size.getWidth();
}

public int getHeight() {
    return size.getHeight();
}

public Size getSize() {
    return size;
}

Hier kann entweder die Größe Eigenschaft oder die Höhe / Breite Eigenschaften der Einfachheit halber sind nur - aber ich sehe nicht, dass das macht sie in irgendeiner Weise ungültig

.

Ich glaube nicht eine Bohne eine Schnittstelle auf es haben sollte, im Allgemeinen. Eine javabean ist eine Schnittstelle im allgemeineren Sinne. Eine Schnittstelle gibt den externen Vertrag etwas komplexer. Ein javabean Außen Vertrag und seine interne Darstellung identisch ist.

Ich würde nicht sagen, dass Sie nicht Getter in einer Schnittstelle haben sollten, though. Es macht durchaus Sinn, eine ReadableDataThingie Schnittstelle zu haben, die von DataThingieBean umgesetzt wird.

  

Ich habe gehört, wie Leute sagen, dass, als ein   Generell gilt, dass eine Schnittstelle nur   definiert das Verhalten und nicht Zustand. Hat   Dies bedeutet, dass eine Schnittstelle soll nicht   enthalten Getter und Setter?

Für den Anfang zumindest mit Java und ohne Ausnahme Erklärungen, können Sie nicht vollständig Verhalten ohne Zustand definieren. In Java-Schnittstellen definieren nicht Verhalten. Sie können es nicht. Was sie definieren sind Typen; Versprechen eine Reihe von Feature Signaturen möglicherweise mit einigen Post-Bedingungen wrt Ausnahmen zu implementieren. Aber das ist es. Verhalten und Zustand werden durch Klassen definiert diese Schnittstellen implementieren.

Zweitens, wenn Getter und Setter in einer Schnittstelle definiert sind, sie nicht wirklich definieren komplette Verhalten (andere, dass man für Lese- und ist für Schreib WRT eine Eigenschaft.) Sie komplexes Verhalten hinter Getter und Setter haben können, aber sie können nur in den tatsächlichen Klassen implementiert werden. Es gibt nichts in der Java-Sprache, die uns frei lassen kann Verhalten in Schnittstellen definieren mit Ausnahme der restriktivsten der Fälle.

Damit in Betracht, es ist nichts falsch - syntaktisch und semantisch -. Mit Getter und Setter in Schnittstellen mit

Wenn Ihre Anwendung gut modelliert und das Problem erfordert, dass Sie eine Schnittstelle definiert, Getter und Setter haben, warum nicht. Nehmen wir zum Beispiel einen Blick auf die ServletResponse Schnittstelle.

Wenn wir nun an Getter und Setter aus der Sicht aussehen Klassen konform mit den Spezifikationen Java Beans Implementierung, dann brauchen Sie keine Schnittstellen für sie zu definieren.

Aber wenn man Dinge, die Getter und Setter erfordern, wie eine Bohne könnte, und das auch bei der Kompilierung-Typ angeschlossen werden muss (nicht zur Laufzeit wie eine Bohne könnten), und für die mehr Implementierungen existieren könnten ja, dann, diese für eine Schnittstelle nennen würde definieren Getter und Setter.

Hoffe, es hilft.

Dies berührt den ganzen Getter / Setters ist böses Thema, das mehrmals auf dieser Seite gerichtet und anderswo.

Ich neige dazu, zu begünstigen nicht Accessoren in der Schnittstelle, aber Kollaborateure Argumente für die Implementierung mit Konstruktor hinzuzufügen.

Die Tatsache, dass die einfache Implementierung von etwas ist wie ein Getter nicht aufhören sollte es in einer Schnittstelle zu sein, wenn es sein muss.

Für weitere Lesung:. Praktische API Design-Bekenntnisse eines Java-Framework Architect (Jaroslav Tulach 2008 Apress)

habe ich diese Art von Schnittstellen, zum Beispiel wir Klassen mit Feldern Begindate, endDate hatten. Diese Felder waren in vielen Klassen und ich hatte einen Anwendungsfall muß ich diese Daten für verschiedene Objekte, so dass ich extrahierte Schnittstelle und war sehr zufrieden:)

Im Grunde genommen, wenn die Antwort auf „Muß ich den Wert von [Staat, Eigentum, whateverThignAMaGit], um zu wissen, mit einer Instanz von ihm zu arbeiten?“ ja dann ... gehören die Zugriffsmethoden in der Schnittstelle.

List.size () von John oben ist ein perfektes Beispiel für ein Getter, die in einer Schnittstelle

definiert werden muss

Getter verwendet, um den Zustand eines Objekts abfragen - was Sie wirklich vermeiden können, wenn Ihre Schnittstelle zu entwerfen. Lesen Sie http://www.pragprog.com/articles/tell-dont-ask

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top