Erstellen Sie eine Klasse, die als unveränderliche Liste von String Objekte.
Ich habe beschlossen, Google Guava ImmutableList & lt; E & gt; Sammlung, anstatt ein einfaches Liste & lt; E & gt; mit Liste & lt; E & gt; , die nicht gewappnet ist, umgebrochen zu werden (Quelle: Unveränderliche Sammlungen erklärt ).
Hier einige Versuche, obwohl mehr Kombinationen möglich sind. Verzeihen Sie die humorvolle Wiedergabe.
Bitte helfen Sie mir, unter einer dieser Implementierungen zu wählen, mit Ihrer Begründung für die Wahl.
Ich denke, der Hauptnachteil von Ansatz Nr. 2 besteht darin, dass Kunden den speziellen Google Guava Typ und wahrscheinlich sollten sie nicht?
Klar, # 3 ist meiner Meinung nach die beste Wahl. final
erzwingt und dokumentiert die Unveränderbarkeit von (diesem Feld) der Klasse, nicht nur die Tatsache, dass List
selbst unveränderlich ist.
Ob Sie ein List
mit einem Javadoc oder einem tatsächlichen ImmutableList
im Getter angeben, ist eine andere Sache. Ich habe Meinungen gesehen, dass das Zurückgeben von ImmutableList
eindeutig die Absicht dokumentiert, aber trotzdem binden Sie sich dann an eine Implementierung anstelle einer Schnittstelle für etwas, das niedrig ist und in Zukunft geändert werden müsste (selbst wenn Unveränderbarkeit ist) "allgemein" gut). Es ist also eher eine globale Design-Wahl für Ihre Anwendung als nur für einen Anwendungsfall. Wenn Sie ImmutableList
verwenden, denke ich nicht, dass dies ein echtes Problem für die Clients ist. Der Name ist eindeutig und kann über Ihre IDE leicht als eine Implementierung von List
gesehen werden, und sie können auf das Javadoc if zugreifen sie wollen mehr Informationen. Und wer weiß, vielleicht mögen sie es und fangen an, es auch zu benutzen, mit all den anderen Leckereien, die Guava bietet: -)
Aus Ihrer Problemstellung ("es sollte nur eine Klasse für eine gegebene Menge von Strings geben"), klingt es wie das, was Sie wirklich wollen, ist ein Interner<ImmutableSet<String>>
.
Interners.newStrongInterner()
), um sicherzustellen, dass Sie nur eine Instanz eines Objekts mit beliebigen Daten haben. Alternativ können Sie sich auch ein Cache<ImmutableSet<String>>
ansehen (siehe Erläuterung zu Caches ) Details).
Ich würde Attempt #2
über Attempt #1
verwenden, weil es dokumentiert, dass Sie ImmutableList-Instanzen immer zurückgeben. Generell ist es sinnvoll Rückgabetypen so spezifisch wie möglich und Parametertypen so allgemein wie möglich zu wählen. Aber für beide Fälle bevorzugen Schnittstellen gegenüber konkreten Klassen.
Nun, ImmutableList
ist eine abstrakte Klasse und keine Schnittstelle. Aber aufgrund seiner Natur verhält es sich sehr ähnlich wie eine Schnittstelle.
Attempt #3
ist sinnvoll, wenn Ihr Klassenmitgliedsreferenz spellings
sich nicht für die Lebensdauer des Objekts ändern kann und / oder Sie die gesamte Klasse selbst unveränderbar machen möchten. Andernfalls, wenn spellings
während der Lebensdauer des Objekts einer anderen ImmutableList zugewiesen werden kann, ist dies nicht sinnvoll.
Angesichts des Anwendungsfalls in Ihrem Beispiel neige ich dazu zu sagen, dass # 3 die beste Wahl ist.
Tags und Links java immutability guava