Ich habe einige gemeinsame Konstanten, die von mehreren Klassen verwendet werden.
Was ist der effektivste Weg, um in diesem Fall zu entwerfen:
Oder gibt es einen anderen besseren Ansatz?
Hinweis: - Ich suche nach der besten OO-Technik, die dafür geeignet wäre.
Konstanten sollten streng mit einem Typ verbunden sein, sie sollten nicht einfach "existieren". Eine Constants
-Klasse mag zwar praktisch erscheinen, aber sie wird bald nicht mehr zu halten sein, ganz zu schweigen von vielen, die sie als Antipattern betrachten.
Es ist schwierig, Verbesserungen vorzuschlagen, ohne Ihren Code zu sehen, aber es scheint, als müssten Sie Ihr Design überdenken, wenn Sie dieselben Konstanten finden, die in einigen anderen Klassen außerhalb des Bereichs eines Typs definiert sind.
Wenn die contants einer api gewidmet sind, definieren Sie sie dort. ZB
%Vor%Wenn Konstanten nicht zu einer einzigen API gehören, definieren Sie eine Konstantenschnittstelle. Z.B. javax.swing.WindowConstants .
Oder gibt es einen anderen besseren Ansatz? Hinweis: - Ich suche nach der besten OO-Technik, die dafür geeignet wäre. Java
Das bringt uns zu der Frage zurück, wie Konstanten verwendet werden. Meistens werden sie verwendet, um bedingten Code zu schreiben. ZB
%Vor% Finde in diesem Fall heraus, was der Zweck der Konstanten ist. Im obigen Beispiel sollen die Aufgaben gruppiert werden, oder wenn Sie darüber nachdenken, sie zur Ausführung anzuordnen. Verschiebe diese Logik in eine eigene Klasse. Z.B. Führen Sie eine Priority
-Klasse ein, die Compareable
implementieren könnte;)
Sie können auch einen Blick auf mein Blog über type-switches Ссылка . Es geht um enum Missbrauch, aber es gilt auch für Konstanten.
Sie können versuchen, eine Klasse zu erstellen, die alle Konstanten enthält (d. h. den zweiten Ansatz).
Zum Beispiel:
%Vor%und dann benutze es wie
%Vor%Da einige vorgeschlagen haben, die Schnittstelle zu verwenden, um Konstanten zu erstellen, denke ich nicht, dass dies eine gute Wahl wäre. Die Verwendung von Interfaces zur Erstellung von Konstanten hat auch einige Nachteile:
- Die Verwendung einer Schnittstelle erlaubt es nicht, einen Mechanismus zum Konvertieren der Konstanten in eine sichtbare / für Menschen lesbare Implementierung zu implementieren Darstellung.
- Wenn die Konstanten ein "Implementierungsdetail" sind, ist eine Schnittstelle möglicherweise nicht der natürliche Ort für den Wert (CodeSmells, ListenToTheCode).
- Aufgrund der Java-Compiler-Optimierung ist eine vollständige Neukompilierung aller Klassen mit den Konstanten erforderlich, wenn sich eine Konstante ändert. Nur die Schnittstelle zu ändern und neu zu kompilieren funktioniert nicht (dies ist jedoch der Fall, wenn alle Konstanten als 'statisch final' definiert sind.
Siehe:
Konstante Klasse:
%Vor%Und Verwendung:
%Vor% Bearbeiten:
In den meisten Fällen verwenden Sie interface
anstelle von class
, wenn diese Schnittstelle nicht von einer Klasse implementiert werden muss, dann ist es nicht notwendig, public static final
hinzuzufügen, weil es standardmäßig public static final
ist, so dass Ihr Code mehr aussieht sauber.
Entwerfe eine Klasse wie AppUtil.java und definiere deine Konstanten public static final wie unten:
%Vor%und wann Sie die Variable verwenden möchten. wie unten:
%Vor%Tags und Links java