Richtlinien zur Verwendung von Java-Schnittstelle - Sind Getter und Setter in einer Schnittstelle schlecht?
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.
Lösung
Ich denke, dass es zwei Arten von Schnittstellen im Allgemeinen erklärt:
- Service-Beschreibung . Dies könnte so etwas wie
CalculationService
sein. Ich glaube nicht, dass MethodengetX
in dieser Art Schnittstelle sein soll, und sicher nichtsetX
. Sie ganz klar Implementierung Detail bedeuten, die nicht die Aufgabe dieser Art der Schnittstelle ist. - 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
eingebenAndere 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.
Es gibt nichts von Natur aus böse über Getter / Setter. Allerdings:
- Ich neige dazu, meine Objekte unveränderlich zu machen (in erster Instanz) in Bezug auf die Felder, die sie enthalten. Warum ? Ich instanziiert die meisten Dinge, die während der Bauphase. Wenn ich später etwas ändern will, dann entspannen ich diese Einschränkungen. Also meine Schnittstellen werden dazu neigen, Getter zu enthalten, aber nicht Setter (es gibt noch andere Vorteile - insbesondere Threading).
- Ich möchte meine Objekte Dinge für mich tun , nicht umgekehrt. Also, wenn einer meiner Objekte eine Reihe von Getter erwirbt, fange ich an zu fragen, ob das Objekt sollte in ihm mehr Funktionalität, anstatt auszusetzen alle seine Daten für etwas anderes zu arbeiten. Siehe diese Antwort für mehr Details.
Diese sind alle Richtlinien, Anm.
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 mussGetter 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