Deklarieren Sie keine Schnittstellen für unveränderliche Objekte
[BEARBEITEN] Wenn die fraglichen Objekte Datenübertragungsobjekte (DTOs) oder einfache alte Daten (PODs) darstellen
Ist das eine vernünftige Richtlinie?
Bisher habe ich häufig Schnittstellen für versiegelte Klassen erstellt, die unveränderlich sind (Daten können nicht geändert werden). Ich habe versucht, mich selbst zu hüten, die Schnittstelle überall dort zu verwenden, wo es mir um Unveränderlichkeit geht.
Leider durchdringt die Benutzeroberfläche den Code (und ich mache mir nicht nur Sorgen um meinen Code). Sie beenden die Übergabe einer Schnittstelle und möchten diese dann an einen Code übergeben, der wirklich davon ausgehen möchte, dass das an ihn übergebene Objekt unveränderlich ist.
Aufgrund dieses Problems überlege ich mir, niemals Schnittstellen für unveränderliche Objekte zu deklarieren.
Dies könnte Konsequenzen in Bezug auf Unit-Tests haben. Aber scheint dies ansonsten eine vernünftige Richtlinie zu sein?
Oder gibt es ein anderes Muster, das ich verwenden sollte, um das Problem der "Ausbreitungsschnittstelle" zu vermeiden, das ich sehe?
(Ich verwende diese unveränderlichen Objekte aus verschiedenen Gründen: Hauptsächlich aus Gründen der Threadsicherheit, da ich viel Code mit mehreren Threads schreibe; aber auch, weil ich vermeiden kann, defensive Kopien von Objekten an Methoden zu übergeben. Code wird in diesem Fall sehr viel einfacher.) In vielen Fällen wissen Sie, dass etwas unveränderlich ist - was Sie nicht tun, wenn Sie eine Schnittstelle erhalten haben. Tatsächlich können Sie häufig nicht einmal eine defensive Kopie eines Objekts erstellen, auf das über eine Schnittstelle verwiesen wird, wenn es keine Schnittstelle bietet Klonoperation oder irgendeine Art, sie zu serialisieren ...)
[BEARBEITEN]
In diesem Blogbeitrag von Eric Lippert finden Sie weitere Informationen zu den Gründen, warum ich Objekte unveränderlich machen möchte:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Ich sollte auch darauf hinweisen, dass ich hier mit einigen Konzepten auf niedrigerer Ebene arbeite, wie z. B. Elementen, die in Jobwarteschlangen mit mehreren Threads bearbeitet / weitergegeben werden. Dies sind im Wesentlichen DTOs.
Auch Joshua Bloch empfiehlt in seinem Buch Effective Java die Verwendung unveränderlicher Objekte .
Nachverfolgen
Vielen Dank für das Feedback an alle. Ich habe mich entschlossen, diese Richtlinie für DTOs und deren Mitglieder zu verwenden. Bisher funktioniert es gut, aber es ist erst eine Woche her ... Trotzdem sieht es gut aus.
Es gibt noch einige andere Fragen, die ich dazu stellen möchte. vor allem etwas, das ich "Deep or Shallow Immutability" nenne (Nomenklatur, die ich beim Klonen von Deep and Shallow gestohlen habe) - aber das ist eine Frage für ein anderes Mal.
List<Number>
die halten kann Integer
, Float
, Long
, BigDecimal
, etc ... All das sich unveränderlich sind.