Angenommen, Sie müssen eine Klasse definieren, die nur Konstanten enthält.
public static final String SOME_CONST = "SOME_VALUE";
Was ist der bevorzugte Weg, dies zu tun?
- Schnittstelle
- Abstrakte Klasse
- Abschlussklasse
Welches soll ich verwenden und warum?
Erläuterungen zu einigen Antworten:
Aufzählungen - Ich werde keine Aufzählungen verwenden, ich zähle nichts auf, sondern sammle nur einige Konstanten, die in keiner Weise miteinander verwandt sind.
Schnittstelle - Ich werde keine Klasse als eine festlegen, die die Schnittstelle implementiert. Ich möchte nur die Schnittstelle verwenden, um Konstanten wie folgt aufzurufen : ISomeInterface.SOME_CONST
.
java
class-constants
Yuval Adam
quelle
quelle
Antworten:
Verwenden Sie eine letzte Klasse. Der Einfachheit halber können Sie dann einen statischen Import verwenden, um Ihre Werte in einer anderen Klasse wiederzuverwenden
in einer anderen Klasse:
quelle
VALUE1.equals(variable)
da er NPE vermeidet.In Ihrer Klarstellung heißt es: "Ich werde keine Aufzählungen verwenden, ich zähle nichts auf, sondern sammle nur einige Konstanten, die in keiner Weise miteinander verwandt sind."
Wenn die Konstanten überhaupt nicht miteinander verwandt sind, warum möchten Sie sie dann zusammen sammeln? Setzen Sie jede Konstante in die Klasse ein, mit der sie am engsten verwandt ist.
quelle
Meine Vorschläge (in absteigender Reihenfolge der Präferenzen):
1) Tu es nicht . Erstellen Sie die Konstanten in der tatsächlichen Klasse dort, wo sie am relevantesten sind. Eine Klasse / Schnittstelle mit einer Menge Konstanten zu haben, folgt nicht wirklich den Best Practices von OO.
Ich und alle anderen ignorieren von Zeit zu Zeit die Nummer 1. Wenn du das machst, dann:
2) Abschlussklasse mit privatem Konstruktor Dies verhindert zumindest, dass jemand Ihren 'Beutel mit Konstanten' missbraucht, indem er ihn erweitert / implementiert, um einen einfachen Zugriff auf die Konstanten zu erhalten. (Ich weiß, dass du gesagt hast, du würdest das nicht tun - aber das bedeutet nicht, dass jemand mitkommt, nachdem du es nicht getan hast.)
3) Schnittstelle Dies wird funktionieren, aber nicht meine Präferenz, wenn ich den möglichen Missbrauch in # 2 erwähne.
Nur weil dies Konstanten sind, heißt das im Allgemeinen nicht, dass Sie keine normalen oo-Prinzipien auf sie anwenden sollten. Wenn sich nur eine Klasse um eine Konstante kümmert, sollte sie privat und in dieser Klasse sein. Wenn sich nur Tests um eine Konstante kümmern, sollte sie sich in einer Testklasse befinden, nicht im Produktionscode. Wenn eine Konstante an mehreren Stellen definiert ist (nicht nur versehentlich dieselbe) - Refactor, um Doppelarbeit zu vermeiden. Und so weiter - behandeln Sie sie wie eine Methode.
quelle
Wie Joshua Bloch in Effective Java feststellt:
Sie können eine Aufzählung verwenden, wenn alle Ihre Konstanten verwandt sind (wie Planetennamen), die Konstantenwerte in Klassen einfügen, auf die sie sich beziehen (wenn Sie Zugriff darauf haben), oder eine nicht instanziierbare Dienstprogrammklasse verwenden (einen privaten Standardkonstruktor definieren). .
Dann können Sie, wie bereits erwähnt, statische Importe verwenden, um Ihre Konstanten zu verwenden.
quelle
Meine bevorzugte Methode ist es, das überhaupt nicht zu tun. Das Alter der Konstanten starb so ziemlich, als Java 5 typsichere Aufzählungen einführte. Und schon vorher veröffentlichte Josh Bloch eine (etwas wortreichere) Version davon, die auf Java 1.4 (und früher) funktionierte.
Sofern Sie keine Interoperabilität mit einem älteren Code benötigen, gibt es keinen Grund mehr, benannte String / Integer-Konstanten zu verwenden.
quelle
Verwenden Sie einfach die letzte Klasse.
Wenn Sie andere Werte hinzufügen möchten, verwenden Sie eine abstrakte Klasse.
Es macht nicht viel Sinn, eine Schnittstelle zu verwenden, eine Schnittstelle soll einen Vertrag spezifizieren. Sie möchten nur einige konstante Werte deklarieren.
quelle
Sind Enums nicht die beste Wahl für solche Sachen?
quelle
enum
s sind in Ordnung. IIRC, ein Element in effektivem Java (2. Ausgabe), enthältenum
Konstanten, die Standardoptionen auflisten, die ein [Java-Schlüsselwort]interface
für einen beliebigen Wert implementieren .Ich bevorzuge die Verwendung eines [Java-Schlüsselworts]
interface
gegenüber einemfinal class
for-Konstanten. Sie erhalten implizit diepublic static final
. Einige Leute werden argumentieren, dassinterface
es schlechten Programmierern erlaubt, es zu implementieren, aber schlechte Programmierer werden Code schreiben, der nervt, egal was Sie tun.Welches sieht besser aus?
Oder:
quelle
Oder 4. Fügen Sie sie in die Klasse ein, die die Logik enthält, die die Konstanten am häufigsten verwendet
... sorry, konnte nicht widerstehen ;-)
quelle
Einer der Nachteile des privaten Konstruktors ist, dass die existierende Methode niemals getestet werden konnte.
Aufzählung nach dem Naturkonzept gut, um in einem bestimmten Domänentyp anzuwenden, wendet es auf dezentrale Konstanten an, sieht nicht gut genug aus
Das Konzept von Enum lautet "Aufzählungen sind Sätze eng verwandter Elemente".
Das Erweitern / Implementieren einer konstanten Schnittstelle ist eine schlechte Praxis. Es ist schwierig, über die Anforderung nachzudenken, eine unveränderliche Konstante zu erweitern, anstatt direkt darauf zu verweisen.
Wenn Sie ein Qualitätswerkzeug wie SonarSource anwenden, gibt es Regeln, die Entwickler dazu zwingen, eine konstante Schnittstelle zu löschen. Dies ist eine unangenehme Sache, da viele Projekte die konstante Schnittstelle genießen und selten "erweiterte" Dinge auf konstanten Schnittstellen passieren
quelle