Gibt es eine Möglichkeit, Eigenschaftendateien als stark typisierte Klassen zu erhalten? Ich denke, es gibt Code-Generatoren, aber mit Anmerkungen zu tun wäre viel cooler.
Was ich meine ist:
%Vor%vielleicht mit
%Vor%wird
%Vor%Wenn nicht soll ich ein Open-Source-Projekt dafür starten?
ZUSATZ ZUR FRAGE;
Ich denke, wir haben eine foo.properties Datei mit sagen wir mehr als 10 Einträgen; und denke, es wird als einfache Konfigurationsdatei verwendet. Ich glaube, dass diese Konfigurationseinträge als eine Konfigurationsklasse mit verwandten getXXX-Methoden zu anderen Teilen des Designs bereitgestellt werden sollten. Dann greift der Rest des Systems auf die Konfiguration über die bereitgestellte Klasse zu, anstatt sich mit Schlüsselnamen zu befassen, und muss sich nicht darum kümmern, wo die Konfiguration herkommt. Dann können Sie diese Klasse durch einen Schein ersetzen, wenn Sie Anrufer testen und die Abhängigkeit vom Dateisystem verschwindet. Auf der anderen Seite ist es wirklich nett zu alle Einträge stark typisiert erhalten.
Bei diesem Problem handelt es sich also um ein Problem im Zusammenhang mit der Codegenerierung im Hintergrund, es hat nichts mit Laufzeit zu tun. Aber Code-Generierung mit einem externen Etwas anstelle von Anmerkungen erschien mir nicht nett. Obwohl ich mit Anmerkungen nicht sehr vertraut bin, denke ich, dass dies erreicht werden könnte (aber ich beachte, dass Anmerkungen keine Klassen als McDowell-Punkte generieren können)
Es gibt ein ähnliches Projekt für die Konfiguration statisch typisierter Dateien . Es erfordert die Deklaration einer Schnittstelle, aber es füllt die Implementierung selbst aus:
%Vor%Es gibt zahllose Frameworks, die das für XML mit verschiedenen erforderlichen Konfigurationen erreichen. Der Standard, der mit Java gebündelt wird, ist JaxB, aber es ist nicht genau ein Ein-Liner-XML-Persistenz-Framework ...
Das Problem ist, dass die Verwendung der Eigenschaftendatei nur in den einfachsten Klassen besser funktioniert als XML (oder JSON, ...). Wenn die Klasse etwas komplexer wird, wird die Eigenschaftendatei zum Albtraum. Ein anderes Problem ist das mit trivialen Klassen - es gibt keinen großen Unterschied zwischen Xml und Eigenschaften.
Das bedeutet, dass der Umfang des Projekts eher begrenzt sein wird. Meistens nützlich für Projekte, die viele einfache Eigenschaftendateien enthalten.
In einer großen Anwendung, mit der ich gearbeitet habe, wird das Lesen von Eigenschaftstypen stark oft mit einer einfachen Factory-Methode durchgeführt.
%Vor%Das Annotation Processing Tool ( apt ) kann Klassen nicht ändern ( obwohl es neue schaffen kann). Um die Klasse zur Kompilierungszeit zu ändern, müssten Sie wahrscheinlich die AST bearbeiten (wie es das Projekt Lombok tut). Der einfachste Ansatz wäre wahrscheinlich, die Klassen zu generieren und dann die generierte Bibliothek als Abhängigkeit von anderem Code zu verwenden.
Eine andere Möglichkeit besteht darin, ein Datenbindungs-Framework zu verwenden, das dies tut. Selbst einer, der dies nicht direkt zu unterstützen scheint, könnte funktionieren: Zum Beispiel würde der Jackson JSON-Prozessor dies durch etwas wie: ObjectMapper m = neuer ObjectMapper ();
MyBean bean = m.convertValue (Eigenschaften, MyBean.class);
// (Hinweis: Benötigt den neuesten Code aus dem Stamm; andernfalls muss zuerst geschrieben werden, lesen Sie zurück) Dies funktioniert so lange, wie Einträge in der Eigenschaftenzuordnung mit logischen Bean-Eigenschaften übereinstimmen und String-Werte in übereinstimmende zugrunde liegende Werte konvertiert werden können.
Etwas wie JFig (hässlicher IMO), Commons-Konfiguration oder EasyConf ?
Wenn du es statisch machen willst, ist es ein Problem mit der Codegenerierung, das ganz einfach gelöst werden kann (für jedes Element in der Datei, erzeuge eine neue Methode getXXX
).
Aber wenn Sie dies zur Laufzeit möchten, dann haben Sie das Problem, dass Ihre Code-Referenzierungsmethode zur Kompilierungszeit nicht existiert. Ich denke nicht, dass es getan werden kann.
(Wenn Sie nach einem Idead-Projekt suchen, können Sie umgekehrt eine Schnittstelle mit Accessormethode und -annotation sowie eine zur Laufzeit generierte Implementierung verwenden, die auf den annotierten Methoden basiert.)
Das OP möchte eine Eigenschaftendatei einer Java-API zuordnen, so dass jede benannte Eigenschaft in der Datei einer ähnlich benannten Getter-Methode in der API entspricht. Ich nehme an, dass eine Anwendung dann diese API verwenden würde, um Eigenschaftswerte zu erhalten, ohne Eigenschaftszeichenfolgen verwenden zu müssen.
Das konzeptionelle Problem besteht darin, dass eine Eigenschaftendatei grundsätzlich keine statisch typisierte Entität ist. Jedes Mal, wenn jemand eine Eigenschaftendatei bearbeitet, können sie neue Eigenschaften hinzufügen und somit den "Typ" der Eigenschaftendatei ändern ... und implizit die Signatur der entsprechenden API. Wenn wir überprüft haben, dass es keine unerwarteten Eigenschaften gab, als die Java-Anwendung die Eigenschaftendatei geladen hat, haben wir eine explizite dynamische Typüberprüfung. Wenn wir nicht nach unerwarteten (z. B. falsch benannten) Eigenschaften suchen, haben wir eine Fehlerquelle. Die Dinge werden noch unordentlicher, wenn Sie wollen, dass die Arten von Eigenschaftswerten etwas anderes als ein String sind.
Der einzige Weg, wie Sie das richtig machen könnten, wäre, das Konzept eines Schemas für eine Eigenschaftendatei zu entwickeln, das die Eigenschaftsnamen und die Typen der Eigenschaftswerte spezifiziert. Implementieren Sie dann einen Eigenschaftendatei-Editor, der sicherstellt, dass der Benutzer keine Eigenschaften hinzufügen kann, die mit dem Schema in Konflikt stehen.
Und an dieser Stelle sollten wir erkennen, dass eine bessere Lösung die Verwendung von XML als Eigenschaftendateirepräsentation, ein XML-Schema-getriebener Editor zum Bearbeiten von Eigenschaftendateien und JAXP oder etwas Ähnliches zum Zuordnen der Eigenschaftendatei zu Java-APIs wäre.
Ich denke, das wird dein Problem lösen Ich habe dieses Eigentumsrahmen für das letzte Jahr geschrieben. Es bietet mehrere Möglichkeiten zum Laden von Eigenschaften und lässt sie auch stark typisieren.
Sehen Sie sich Ссылка
anEs ist offen und vollständig dokumentiert
Hier ist meine kurze Beschreibung von SourceForge:
%Vor%Tags und Links java annotations properties