Ich habe Beispiele wie dieses gesehen:
public class MaxSeconds {
public static final int MAX_SECONDS = 25;
}
und nahm an, dass ich eine Konstantenklasse haben könnte, in die Konstanten eingeschlossen werden könnten, und erklärte sie für statisch endgültig. Ich kenne praktisch kein Java und frage mich, ob dies der beste Weg ist, Konstanten zu erstellen.
Antworten:
Das ist durchaus akzeptabel, wahrscheinlich sogar der Standard.
Wo
TYPE
ist der Typ,NAME
ist der Name in allen Großbuchstaben mit Unterstrichen für Leerzeichen undVALUE
ist der konstante Wert;Ich empfehle dringend, Ihre Konstanten NICHT in ihre eigenen Klassen oder Schnittstellen zu setzen.
Als Randnotiz: Variablen, die als endgültig deklariert und veränderbar sind, können weiterhin geändert werden. Die Variable kann jedoch niemals auf ein anderes Objekt zeigen.
Zum Beispiel:
Das ist legal und
ORIGIN
wäre dann ein Punkt bei (3, 0).quelle
Ich würde dringend davon abraten, eine einzige Konstantenklasse zu haben. Es mag zu dieser Zeit eine gute Idee sein, aber wenn Entwickler sich weigern, Konstanten zu dokumentieren, und die Klasse auf über 500 Konstanten anwächst, die alle überhaupt nicht miteinander in Beziehung stehen (da sie sich auf ganz unterschiedliche Aspekte der Anwendung beziehen), ist dies der Fall Im Allgemeinen wird die Konstantendatei vollständig unlesbar. Stattdessen:
quelle
Es ist eine SCHLECHTE PRAXIS , Schnittstellen nur zum Halten von Konstanten zu verwenden ( von Josh Bloch als konstantes Schnittstellenmuster bezeichnet ). Hier ist, was Josh rät:
Beispiel:
Über die Namenskonvention:
quelle
abstract
Notation für die Klasse anstelle des privaten Konstruktors zu verwenden.abstract
anstelle eines privaten Konstruktors verhindert die Instanziierung nicht vollständig, da man sie unterklassifizieren und die Unterklasse instanziieren könnte (nicht, dass dies eine gute Idee ist, aber möglich). @ToolmakerSteve Sie können eine Klasse nicht mit einem privaten Konstruktor unterordnen (zumindest nicht ohne einen großen schlechten Hack), da der Konstruktor der Unterklasse den (jetzt privaten) Konstruktor seiner Oberklasse aufrufen muss. Das Markierenfinal
ist also unnötig (aber vielleicht expliziter).In Effective Java (2. Ausgabe) wird empfohlen, Enums anstelle von statischen Ints für Konstanten zu verwenden.
Hier finden Sie eine gute Beschreibung der Aufzählungen in Java: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
Beachten Sie, dass am Ende dieses Artikels folgende Frage gestellt wird:
Mit einer Antwort von:
quelle
Vermeiden Sie einfach die Verwendung einer Schnittstelle:
Es ist verlockend, verletzt jedoch die Kapselung und verwischt die Unterscheidung von Klassendefinitionen.
quelle
Ich benutze folgenden Ansatz:
Dann benutze ich zum Beispiel,
Constants.DB.Connection.URL
um konstant zu werden. Es sieht für mich eher "objektorientiert" aus.quelle
Das Erstellen statischer Endkonstanten in einer separaten Klasse kann zu Problemen führen. Der Java-Compiler optimiert dies tatsächlich und platziert den tatsächlichen Wert der Konstante in einer Klasse, die darauf verweist.
Wenn Sie später die Klasse 'Konstanten' ändern und andere Klassen, die auf diese Klasse verweisen, nicht erneut hart kompilieren, wird eine Kombination aus alten und neuen Werten verwendet.
Anstatt diese als Konstanten zu betrachten, stellen Sie sie sich als Konfigurationsparameter vor und erstellen Sie eine Klasse, um sie zu verwalten. Lassen Sie die Werte nicht endgültig sein und ziehen Sie sogar die Verwendung von Gettern in Betracht. Wenn Sie in Zukunft festlegen, dass einige dieser Parameter tatsächlich vom Benutzer oder Administrator konfiguriert werden können, ist dies viel einfacher.
quelle
Der größte Fehler, den Sie machen können, ist das Erstellen einer global zugänglichen Klasse mit einem generischen Namen wie Konstanten. Dies wird einfach mit Müll übersät und Sie verlieren alle Fähigkeit herauszufinden, welcher Teil Ihres Systems diese Konstanten verwendet.
Stattdessen sollten Konstanten in die Klasse gehen, die sie "besitzt". Haben Sie eine Konstante namens TIMEOUT? Es sollte wahrscheinlich in Ihre Communications () - oder Connection () -Klasse aufgenommen werden. MAX_BAD_LOGINS_PER_HOUR? Geht in User (). Und so weiter und so fort.
Die andere mögliche Verwendung sind Java .properties-Dateien, wenn "Konstanten" zur Laufzeit definiert werden können, aber nicht einfach vom Benutzer geändert werden können. Sie können diese in Ihre .jars packen und mit dem Class resourceLoader referenzieren.
quelle
Das ist der richtige Weg.
Im Allgemeinen werden Konstanten nicht in separaten "Konstanten" -Klassen aufbewahrt, da sie nicht erkennbar sind. Wenn die Konstante für die aktuelle Klasse relevant ist, hilft es dem nächsten Entwickler, sie dort zu belassen.
quelle
Was ist mit einer Aufzählung?
quelle
Ich benutze lieber Getter als Konstanten. Diese Getter können konstante Werte zurückgeben, z
public int getMaxConnections() {return 10;}
alles, was die Konstante benötigt, durchläuft einen Getter.Ein Vorteil ist, dass Sie, wenn Ihr Programm über die Konstante hinauswächst - Sie finden, dass es konfigurierbar sein muss - einfach ändern können, wie der Getter die Konstante zurückgibt.
Der andere Vorteil ist, dass Sie zum Ändern der Konstante nicht alles neu kompilieren müssen, was sie verwendet. Wenn Sie auf ein statisches Endfeld verweisen, wird der Wert dieser Konstante in einen beliebigen Bytecode kompiliert, der darauf verweist.
quelle
Ich bin damit einverstanden, dass die Verwendung einer Schnittstelle nicht der richtige Weg ist. Das Vermeiden dieses Musters hat sogar einen eigenen Gegenstand (# 18) in Blochs effektivem Java .
Ein Argument, das Bloch gegen das konstante Schnittstellenmuster vorbringt, ist, dass die Verwendung von Konstanten ein Implementierungsdetail ist, aber die Implementierung einer Schnittstelle, um sie zu verwenden, macht dieses Implementierungsdetail in Ihrer exportierten API verfügbar.
Das
public|private static final TYPE NAME = VALUE;
Muster ist eine gute Möglichkeit, eine Konstante zu deklarieren. Persönlich denke ich, dass es besser ist, eine separate Klasse zu erstellen, um alle Ihre Konstanten aufzunehmen, aber ich habe nie einen Grund gesehen, dies nicht zu tun, außer persönlichen Vorlieben und Stil.Wenn Ihre Konstanten als Aufzählung gut modelliert werden können, berücksichtigen Sie die Aufzählung - Struktur in 1.5 oder höher.
Wenn Sie eine frühere Version als 1.5 verwenden, können Sie weiterhin typsichere Aufzählungen mithilfe normaler Java-Klassen abrufen. (Weitere Informationen hierzu finden Sie auf dieser Website .)
quelle
Basierend auf den obigen Kommentaren denke ich, dass dies ein guter Ansatz ist, um die altmodische globale Konstantenklasse (mit öffentlichen statischen Endvariablen) auf folgende Weise in ihr enumartiges Äquivalent zu ändern:
Dann kann ich sie auf Folgendes verweisen:
quelle
Ein gutes objektorientiertes Design sollte nicht viele öffentlich verfügbare Konstanten benötigen. Die meisten Konstanten sollten in der Klasse gekapselt sein, die sie für ihre Arbeit benötigt.
quelle
Es gibt eine gewisse Meinung, um dies zu beantworten. Zunächst werden Konstanten in Java im Allgemeinen als öffentlich, statisch und endgültig deklariert. Nachfolgend sind die Gründe aufgeführt:
Ich würde niemals eine Schnittstelle für einen CONSTANTS-Accessor / ein CONSTANTS-Objekt verwenden, nur weil allgemein erwartet wird, dass Schnittstellen implementiert werden. Würde das nicht lustig aussehen:
Stattdessen würde ich zwischen einigen verschiedenen Möglichkeiten wählen, basierend auf einigen kleinen Kompromissen, und daher hängt es davon ab, was Sie brauchen:
quelle
Ein Ansatz, den wir wirklich vermeiden sollten : Verwenden von Schnittstellen zum Definieren von Konstanten.
Das Erstellen einer Schnittstelle speziell zum Deklarieren von Konstanten ist wirklich das Schlimmste: Sie beseitigt den Grund, warum Schnittstellen entworfen wurden: das Definieren von Methodenverträgen.
Selbst wenn bereits eine Schnittstelle vorhanden ist, um einen bestimmten Bedarf zu decken, ist die Deklaration der darin enthaltenen Konstanten nicht sinnvoll, da Konstanten nicht Teil der API und des Vertrags sein sollten, der für Clientklassen bereitgestellt wird.
Zur Vereinfachung haben wir im Allgemeinen 4 gültige Ansätze .
Mit
static final String/Integer
Feld:Mit
Java 5 enum
:TLDR: Was ist der beste Weg und wo finden Sie die Konstanten?
In den meisten Fällen ist der Aufzählungsweg wahrscheinlich feiner als der
static final String/Integer
Weg, und ich persönlich denke, dass derstatic final String/Integer
Weg nur verwendet werden sollte, wenn wir gute Gründe haben, keine Aufzählungen zu verwenden.Und wo wir die konstanten Werte deklarieren sollen, ist die Idee zu suchen, ob es eine einzelne existierende Klasse gibt, die einen spezifischen und starken funktionalen Zusammenhalt mit konstanten Werten besitzt. Wenn wir eine solche Klasse finden, sollten wir sie als Konstantenhalter verwenden . Andernfalls sollte die Konstante keiner bestimmten Klasse zugeordnet werden.
static final String
/static final Integer
versusenum
Die Verwendung von Enums ist wirklich ein Weg, um stark in Betracht gezogen zu werden.
Aufzählungen haben einen großen Vorteil gegenüber
String
oderInteger
konstanten Bereich.Sie legen eine stärkere Kompilierungsbeschränkung fest. Wenn Sie eine Methode definieren, die die Aufzählung als Parameter verwendet, können Sie nur einen Aufzählungswert übergeben, der in der Aufzählungsklasse (oder null) definiert ist.
Mit String und Integer können Sie sie durch beliebige Werte kompatiblen Typs ersetzen. Die Kompilierung ist auch dann in Ordnung, wenn der Wert keine definierte Konstante in den Feldern
static final String
/static final Integer
ist.Beispiel: Unten zwei Konstanten, die in einer Klasse als
static final String
Felder definiert sind:Hier eine Methode, die erwartet, eine dieser Konstanten als Parameter zu haben:
Sie können es folgendermaßen aufrufen:
oder
Keine Kompilierungsbeschränkung hindert Sie jedoch daran, sie auf folgende Weise aufzurufen:
Sie würden den Fehler nur zur Laufzeit haben und nur, wenn Sie zu einem Zeitpunkt eine Überprüfung des übertragenen Werts durchführen.
Bei enum sind keine Überprüfungen erforderlich, da der Client nur einen enum-Wert in einem enum-Parameter übergeben konnte.
Zum Beispiel hier zwei Werte, die in einer Enum-Klasse definiert sind (also sofort einsatzbereit):
Hier eine Methode, die einen dieser Enum-Werte als Parameter erwartet:
Sie können es folgendermaßen aufrufen:
oder
Die Zusammenstellung wird es Ihnen jedoch niemals erlauben, sie auf diese Weise aufzurufen:
Wo sollen wir die Konstanten deklarieren?
Wenn Ihre Anwendung eine einzelne vorhandene Klasse enthält, die eine spezifische und starke funktionale Kohäsion mit den konstanten Werten besitzt, erscheinen 1) und 2) intuitiver.
Im Allgemeinen wird die Verwendung der Konstanten vereinfacht, wenn diese in der Hauptklasse deklariert sind, die sie manipuliert, oder deren Name sehr natürlich ist, um zu erraten, dass wir ihn darin finden werden.
In der JDK-Bibliothek werden beispielsweise die Exponential- und Pi-Konstantenwerte in einer Klasse deklariert, die nicht nur Konstantendeklarationen deklariert (
java.lang.Math
).Die Clients, die mathematische Funktionen verwenden, verlassen sich häufig auf die
Math
Klasse. So können sie Konstanten leicht genug finden und sich auch daran erinnern, woE
undPI
auf sehr natürliche Weise definiert sind.Wenn Ihre Anwendung keine vorhandene Klasse enthält, die eine sehr spezifische und starke funktionale Kohäsion mit den konstanten Werten aufweist, erscheinen die Methoden 1 Variante) und 2 Variante intuitiver.
Im Allgemeinen erleichtert es die Verwendung der Konstanten nicht, wenn diese in einer Klasse deklariert werden, die sie manipuliert, während wir auch 3 oder 4 andere Klassen haben, die sie so oft manipulieren, und keine dieser Klassen scheint natürlicher zu sein als andere Hostkonstantenwerte.
Hier ist es sinnvoll, eine benutzerdefinierte Klasse zu definieren, die nur konstante Werte enthält.
In der JDK-Bibliothek wird die
java.util.concurrent.TimeUnit
Aufzählung beispielsweise nicht in einer bestimmten Klasse deklariert, da es nicht wirklich nur eine JDK-spezifische Klasse gibt, die als die intuitivste erscheint, um sie zu speichern:Viele Klassen deklariert in
java.util.concurrent
Gebrauch ihnen:BlockingQueue
,ArrayBlockingQueue<E>
,CompletableFuture
,ExecutorService
, ... und wirklich niemand von ihnen besser geeignet scheint , die Enum zu halten.quelle
Eine Konstante eines beliebigen Typs kann deklariert werden, indem eine unveränderliche Eigenschaft innerhalb einer Klasse erstellt wird (dh eine Mitgliedsvariable mit dem
final
Modifikator). Typischerweise werden auch die Modifikatorenstatic
undpublic
bereitgestellt.Es gibt zahlreiche Anwendungen, bei denen der Wert einer Konstante eine Auswahl aus einem n-Tupel (z. B. Aufzählung ) von Auswahlmöglichkeiten anzeigt . In unserem Beispiel können wir einen Aufzählungstyp definieren, der die möglichen zugewiesenen Werte einschränkt (dh die verbesserte Typensicherheit ):
quelle
Eine einzelne generische Konstantenklasse ist eine schlechte Idee. Konstanten sollten zusammen mit der Klasse gruppiert werden, mit der sie am logischsten verwandt sind.
Anstatt Variablen jeglicher Art (insbesondere Aufzählungen) zu verwenden, würde ich vorschlagen, dass Sie Methoden verwenden. Erstellen Sie eine Methode mit demselben Namen wie die Variable und lassen Sie sie den Wert zurückgeben, den Sie der Variablen zugewiesen haben. Löschen Sie nun die Variable und ersetzen Sie alle Verweise darauf durch Aufrufe der gerade erstellten Methode. Wenn Sie der Meinung sind, dass die Konstante generisch genug ist, dass Sie keine Instanz der Klasse erstellen müssen, um sie zu verwenden, machen Sie die Konstantenmethode zu einer Klassenmethode.
quelle
FWIW, ein Zeitlimit in Sekunden sollte wahrscheinlich eine Konfigurationseinstellung (aus einer Eigenschaftendatei oder durch Injektion wie im Frühjahr eingelesen) und keine Konstante sein.
quelle
Was ist der Unterschied
1.
2.
und verwenden,
MyGlobalConstants.TIMEOUT_IN_SECS
wo immer wir diese Konstante brauchen. Ich denke beide sind gleich.quelle
Ich würde die Klasse nicht (abgesehen vom Gehäuse) als die Konstante bezeichnen ... Ich hätte mindestens eine Klasse von "Einstellungen" oder "Werten" oder "Konstanten", in der alle Konstanten leben würden. Wenn ich eine große Anzahl von ihnen habe, würde ich sie in logische Konstantenklassen (UserSettings, AppSettings usw.) gruppieren.
quelle
Um noch einen Schritt weiter zu gehen, können Sie global verwendete Konstanten in einer Schnittstelle platzieren, damit sie systemweit verwendet werden können. Z.B
Aber dann nicht umsetzen. Verweisen Sie einfach direkt im Code über den vollständig qualifizierten Klassennamen auf sie.
quelle
Für Konstanten ist Enum meiner Meinung nach die bessere Wahl. Hier ist ein Beispiel
öffentliche Klasse myClass {
quelle
Eine Möglichkeit besteht darin, eine 'globale' Klasse mit den konstanten Werten zu erstellen und einen statischen Import in die Klassen durchzuführen, die Zugriff auf die Konstante benötigen.
quelle
static final
ist meine Präferenz, ich würde nur eine verwenden,enum
wenn der Artikel tatsächlich aufzählbar wäre.quelle
ich benutze
static final
deklariere Konstanten und gehe mit der Namensnotation ALL_CAPS. Ich habe einige reale Fälle gesehen, in denen alle Konstanten zu einer Schnittstelle zusammengefasst sind. Einige Beiträge haben dies zu Recht als schlechte Praxis bezeichnet, vor allem, weil dies nicht der Zweck einer Benutzeroberfläche ist. Eine Schnittstelle sollte einen Vertrag erzwingen und kein Ort sein, an dem nicht verwandte Konstanten eingefügt werden können. Das Zusammenfügen zu einer Klasse, die nicht instanziiert werden kann (über einen privaten Konstruktor), ist in Ordnung, wenn die konstante Semantik nicht zu einer bestimmten Klasse gehört ( es). Ich habe immer eine Konstante in die Klasse eingefügt, mit der es am meisten zu tun hat, weil das Sinn macht und auch leicht zu warten ist.Aufzählungen sind eine gute Wahl, um einen Wertebereich darzustellen. Wenn Sie jedoch eigenständige Konstanten mit Schwerpunkt auf dem absoluten Wert speichern (z. B. TIMEOUT = 100 ms), können Sie einfach den
static final
Ansatz wählen .quelle
Ich stimme dem zu, was die meisten sagen. Es ist am besten, Aufzählungen zu verwenden, wenn es um eine Sammlung von Konstanten geht. Wenn Sie jedoch in Android programmieren, gibt es eine bessere Lösung: IntDef Annotation .
Die IntDef-Annotation ist Enums auf einfache Weise überlegen. Sie benötigt deutlich weniger Platz, da sie lediglich eine Markierung zur Kompilierungszeit darstellt. Es ist weder eine Klasse noch verfügt es über die Eigenschaft zur automatischen Konvertierung von Zeichenfolgen.
quelle
Es ist eine schlechte Angewohnheit und eine schrecklich ärgerliche Praxis , Joshua Bloch zu zitieren, ohne den grundlegenden Ground-Zero-Fundamentalismus zu verstehen.
Ich habe auch nichts von Joshua Bloch gelesen
Wie im biblischen Fundamentalismus können alle biblischen Gesetze durch zusammengefasst werden
In ähnlicher Weise kann der Fundamentalismus der Softwareentwicklung durch zusammengefasst werden
Auch unter biblisch-fundamentalistischen Kreisen wird eine starke und vernünftige Folgerung gezogen
Wenn Sie sich als Programmierer nicht respektieren und nur die Aussagen und Prophezeiungen eines Programmier-Guru-nath akzeptieren, ohne die Grundlagen in Frage zu stellen, sind Ihre Zitate und Ihr Vertrauen in Joshua Bloch (und dergleichen) bedeutungslos. Und deshalb hätten Sie eigentlich keinen Respekt vor Ihren Programmierkollegen.
Die Grundgesetze der Softwareprogrammierung
Schnittstellenmusterkonstanten sind eine schlechte Angewohnheit ???
Unter welche Gesetze der grundlegend wirksamen und verantwortungsvollen Programmierung fällt dieses religiöse Edikt?
Lesen Sie einfach den Wikipedia-Artikel über Schnittstellenmusterkonstanten ( https://en.wikipedia.org/wiki/Constant_interface ) und die dummen Ausreden gegen Schnittstellenmusterkonstanten.
Whatif-No IDE? Wer um alles in der Welt würde als Softwareprogrammierer keine IDE verwenden? Die meisten von uns sind Programmierer, die es vorziehen, nicht beweisen zu müssen, dass sie einen macho-aescetischen Überlebenskampf haben, indem sie die Verwendung einer IDE vermeiden.
Verschmutzt den Namespace mit Variablen, die im aktuellen Bereich nicht verwendet werden? Es könnten Befürworter dieser Meinung sein
Die Verwendung von Schnittstellen zum Erzwingen von Konstanten ist ein Missbrauch von Schnittstellen. Befürworter solcher haben eine schlechte Angewohnheit von
Es ist schwierig, wenn nicht unmöglich, Schnittstellen in Zukunft in implementierte Klassen umzuwandeln. Hah .... hmmm ... ???
Was auch immer die Ausreden sein mögen, es gibt KEINE GÜLTIGE Entschuldigung, wenn es darum geht, die Verwendung von Schnittstellenkonstanten zu delegitimieren oder generell zu entmutigen.
Es spielt keine Rolle, wie die ursprünglichen Absichten und mentalen Zustände der Gründerväter waren, die die Verfassung der Vereinigten Staaten ausgearbeitet haben. Wir könnten die ursprünglichen Absichten der Gründerväter diskutieren, aber alles, was mich interessiert, sind die schriftlichen Erklärungen der US-Verfassung. Und es liegt in der Verantwortung jedes US-Bürgers, den schriftlichen literarischen Fundamentalismus und nicht die ungeschriebenen Gründungsabsichten der US-Verfassung auszunutzen.
Ebenso ist es mir egal, was die "ursprünglichen" Absichten der Gründer der Java-Plattform und der Programmiersprache für die Schnittstelle hatten. Was mich interessiert, sind die effektiven Funktionen, die die Java-Spezifikation bietet, und ich beabsichtige, diese Funktionen in vollem Umfang zu nutzen, um die grundlegenden Gesetze einer verantwortungsvollen Softwareprogrammierung zu erfüllen. Es ist mir egal, ob ich als "Verstoß gegen die Absicht für Schnittstellen" wahrgenommen werde. Es ist mir egal, was Gosling oder jemand Bloch über die "richtige Art und Weise, Java zu verwenden" sagt, es sei denn, was sie sagen, verstößt nicht gegen mein Bedürfnis nach EFFEKTIVEN Grundlagen.
Das Fundament ist die Normalisierung von Datenmodellen
Es spielt keine Rolle, wie Ihr Datenmodell gehostet oder übertragen wird. Unabhängig davon, ob Sie Schnittstellen oder Aufzählungen oder Whatevernots verwenden, relational oder ohne SQL, wenn Sie die Notwendigkeit und den Prozess der Normalisierung von Datenmodellen nicht verstehen.
Wir müssen zuerst das Datenmodell einer Reihe von Prozessen definieren und normalisieren. Und wenn wir ein kohärentes Datenmodell haben, können wir NUR dann den Prozessfluss seiner Komponenten verwenden, um das Funktionsverhalten zu definieren und einen Bereich oder einen Bereich von Anwendungen zu blockieren. Und nur dann können wir die API jedes Funktionsprozesses definieren.
Sogar die von EF Codd vorgeschlagenen Facetten der Datennormalisierung sind jetzt stark in Frage gestellt und in Frage gestellt. zB wurde seine Aussage zu 1NF als mehrdeutig, falsch ausgerichtet und zu stark vereinfacht kritisiert, ebenso wie der Rest seiner Aussagen, insbesondere zum Aufkommen moderner Datendienste, Repo-Technologie und Übertragung. IMO sollten die EF Codd-Anweisungen vollständig verworfen und neue mathematisch plausibelere Anweisungen entworfen werden.
Ein eklatanter Fehler von EF Codd und die Ursache für seine Fehlausrichtung auf ein effektives menschliches Verständnis ist seine Überzeugung, dass vom Menschen wahrnehmbare mehrdimensionale Daten mit veränderlichen Dimensionen durch eine Reihe von stückweisen zweidimensionalen Abbildungen effizient wahrgenommen werden können.
Die Grundlagen der Datennormalisierung
Was EF Codd nicht ausdrücken konnte.
Innerhalb jedes kohärenten Datenmodells ist dies die sequentielle abgestufte Reihenfolge der zu erreichenden Datenmodellkohärenz.
In einem Bereich oder Raster von Komponentenanwendungen zwischen Serviceleistungen muss es nur ein einziges kohärentes Datenmodell geben oder es gibt ein Mittel, mit dem sich ein Datenmodell / eine Version identifizieren kann.
Fragen wir uns immer noch, ob wir Schnittstellenkonstanten verwenden könnten? Ja wirklich ?
Es geht um Probleme bei der Datennormalisierung, die konsequenter sind als diese weltliche Frage. Wenn Sie diese Probleme nicht lösen, ist die Verwirrung, die Schnittstellenkonstanten Ihrer Meinung nach verursachen, vergleichsweise gering. Zilch.
Aus der Normalisierung des Datenmodells bestimmen Sie dann die Komponenten als Variablen, als Eigenschaften, als Vertragsschnittstellenkonstanten.
Anschließend bestimmen Sie, welche Werte in die Wertinjektion, die Platzhalterung für die Eigenschaftskonfiguration, die Schnittstellen, die endgültigen Zeichenfolgen usw. fließen.
Wenn Sie die Ausrede verwenden müssen, eine Komponente zu finden, die leichter anhand von Schnittstellenkonstanten zu diktieren ist, bedeutet dies, dass Sie die schlechte Angewohnheit haben, die Normalisierung von Datenmodellen nicht zu üben.
Vielleicht möchten Sie das Datenmodell in eine vcs-Version kompilieren. Dass Sie eine eindeutig identifizierbare Version eines Datenmodells herausziehen können.
In Schnittstellen definierte Werte sind vollständig unveränderlich. Und teilbar. Warum sollten Sie eine Reihe von endgültigen Zeichenfolgen aus einer anderen Klasse in Ihre Klasse laden, wenn Sie nur diese Konstanten benötigen?
Warum also nicht einen Datenmodellvertrag veröffentlichen? Ich meine, wenn Sie es kohärent verwalten und normalisieren können, warum nicht? ...
Jetzt kann ich auf die vertraglich vereinbarten Etiketten meiner Apps wie folgt verweisen
Dies verwirrt den Inhalt der JAR-Datei? Als Java-Programmierer interessiert mich die Struktur des Jars nicht.
Dies stellt die Komplexität des osgi-motivierten Laufzeitaustauschs dar. Osgi ist ein äußerst effizientes Mittel, um Programmierern zu ermöglichen, ihre schlechten Gewohnheiten fortzusetzen. Es gibt bessere Alternativen als Osgi.
Oder warum nicht das? Es gibt kein Durchsickern der privaten Konstanten in den veröffentlichten Vertrag. Alle privaten Konstanten sollten in einer privaten Schnittstelle mit dem Namen "Konstanten" gruppiert werden, da ich nicht nach Konstanten suchen muss und zu faul bin, um wiederholt "private final String" einzugeben.
Vielleicht sogar das:
Das einzige Problem mit Schnittstellenkonstanten, das berücksichtigt werden sollte, ist die Implementierung der Schnittstelle.
Dies ist nicht die "ursprüngliche Absicht" von Schnittstellen? Als würde mir die "ursprüngliche Absicht" der Gründerväter bei der Ausarbeitung der US-Verfassung am Herzen liegen, anstatt wie der Oberste Gerichtshof die schriftlichen Briefe der US-Verfassung interpretieren würde ???
Immerhin lebe ich im Land der Freien, der Wildnis und der Heimat der Tapferen. Sei mutig, sei frei, sei wild - benutze die Schnittstelle. Wenn meine Programmierkollegen sich weigern, effiziente und faule Programmiermittel zu verwenden, bin ich dann nach der goldenen Regel verpflichtet, meine Programmiereffizienz zu verringern, um sie an ihre anzupassen? Vielleicht sollte ich, aber das ist keine ideale Situation.
quelle