2010-03-01 28 views
20

Das Java-Objekt Properties hat sich seit der Prä-Java-Version 5 nicht wesentlich verändert und hat keine Generics-Unterstützung oder sehr nützliche Hilfsmethoden (definiertes Muster zum Einfügen von Klassen zum Verarbeiten von Eigenschaften oder zum Laden aller Eigenschaftendateien in einem Verzeichnis) , beispielsweise).Sind Java-Eigenschaften effektiv veraltet?

Wurde die Entwicklung von Eigenschaften gestoppt? Wenn ja, wie lautet die aktuelle Best Practice für diese Art des Speicherns/Ladens von Eigenschaften?

Oder habe ich etwas völlig verpasst?

+0

Und was ist mit java.util.Dictionary? Es wurde aktualisiert, um Generics zu verwenden, aber es wurde auch lange als "veraltet" dokumentiert. Es ist jedoch immer noch nicht als @deprecated markiert. Ich denke, Abwertung ist ein schwieriges Problem. – omerkudat

+0

@omerkudat, Wörterbuch ist im Grunde eine Karte vor Sammlungen in 1.2.Obwohl es nicht formal veraltet ist, befindet es sich in derselben Gruppe wie Vector. Das ist im Allgemeinen nicht bevorzugt. http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated/ – Yishai

Antwort

10

Viele Konzepte rund um Eigenschaften sind definitiv alt und fragwürdig. Es hat eine sehr geringe Internationalisierung, es fügt Methoden hinzu, die heute nur durch einen generischen Typ erreicht werden, es erweitert Hashtable, das selbst im Allgemeinen nicht verwendet wird, da seine Synchronisation von begrenztem Wert ist und es Methoden gibt, die nicht mit dem übereinstimmen In 1.2 eingeführte Auflistungsklassen und viele der Methoden, die der Properties-Klasse hinzugefügt wurden, bieten im Wesentlichen die Art der Typensicherheit, die durch Generics ersetzt wird.

Wenn es heute implementiert wird, wäre es wahrscheinlich eine spezielle Implementierung eines Map<String, String>, und sicherlich unterstützt eine bessere Codierung in der Eigenschaftendatei.

Das gesagt, es gibt nicht wirklich einen Ersatz, der Komplexität nicht hinzufügt. Sicher ist das java.util.prefs.Preferences api das "neue und verbesserte", aber es fügt eine Ebene der Komplexität hinzu, die weit über das hinausgeht, was für viele Anwendungsfälle benötigt wird. Nur die Verwendung von XML ist auch eine Option (die zumindest die Internationalisierungsprobleme behebt), aber ein Eigenschaftenobjekt passt oft gut zu den Anforderungen und verwendet es dann.

+0

Für die Internationalisierung würden Sie normalerweise die ResourceBundle API verwenden. Überprüfen Sie http://java.sun.com/developer/technicalArticles/javase/i18n_enhance/ und http://bordet.blogspot.com/2007/01/utf-8-handling-for-resourcebundle-and.html – BalusC

+2

@BalusC Meine Vermutung ist, dass Yishai die Eigenarten der Eigenschaftendatei als "schlechte Internationalisierung" bezeichnet hat und ResourceBundle standardmäßig die gleiche Codierung verwendet. –

1

Die Dictionary-Struktur ist eine der ältesten am häufigsten verwendeten Strukturen in den meisten Programmiersprachen http://en.wikipedia.org/wiki/Associative_array, ich bezweifle, dass es veraltet wäre.

Selbst wenn man sie entfernen müsste, gäbe es bald neue Implementierungen außerhalb des Kerns.

Es gibt bereits externe Erweiterungen, Apache Commons sind große Ressourcen, die ich glaube, haben geholfen, Java im Laufe der Jahre zu formen, siehe http://commons.apache.org/configuration/howto_properties.html.

+1

Die Collections Map-Schnittstelle und Implementierer scheinen die formale Lösung von Java für assoziative Arrays - IMHO-Eigenschaften ist mehr eine Bequemlichkeit Sache – Brabster

7

Es ist immer noch eine praktikable Lösung für einfache Konfigurationsanforderungen. Sie benötigen keine Generics-Unterstützung, da Property-Schlüssel und -Werte inhärent Strings sind, dh sie werden in flachen ASCII-Dateien gespeichert. Wenn Sie un/Marshalling/Serialisierung von Objekten benötigen, sind Eigenschaften nicht der richtige Ansatz. Die bevorzugte Methode ist jetzt java.util.prefs.Preferences für alles, was über mäßig anspruchsvolle Konfigurationsanforderungen hinausgeht.

3

Es tut, was es tun muss. Es ist nicht so schwer, Unterstützung für das Lesen aller Eigenschaftendateien in einem Verzeichnis zu schreiben. Ich würde sagen, das ist kein gewöhnlicher Anwendungsfall, also sehe ich das nicht als etwas, das im JDK sein muss.

Es hat sich auch leicht seit Pre-Java 5 geändert, wie die Javadoc besagt, dass Hashtable<Object, Object> erweitert und implementiert Map<Object, Object>.

+1

Für Erklärungen warum 'Hashtable ' nicht 'Hashtable ' sehen: http://StackOverflow.com/Questions/873510/Why-does-Java-util-Properties -implement-mapobject-object-and-not-mapstring –

+0

Danke für den Link @Tom Hawtin, interessante Lektüre. – Brabster

2

"Es hat keine Generics-Unterstützung," Warum benötigt es Generika-Unterstützung; Es handelt sich um Stringschlüssel und String-Werte Ich würde Java-Eigenschaften nicht als veraltet betrachten. Es ist eine reife Bibliothek - das ist alles

+2

behandelt es tatsächlich mit Objektschlüssel und Object-Werten - um auf String-Schlüssel und String-Werte zu beschränken, würden Sie Generika benötigen. – Brabster

+0

Die Klasse bietet Funktionen für den Zeichenfolgenschlüssel und den Zeichenfolgenwert. – dbrown0708

+2

@brabster und @ dbrown0708 Die objektbasierten APIs wurden aufgrund schlechten Designs in die Eigenschaften eingefügt. Person gebaut es ignoriert: "Favor Zusammensetzung über Vererbung" obwohl die Absicht war anders (wie in javadoc: "Die Eigenschaften-Klasse stellt eine persistente Menge von Eigenschaften. Die Eigenschaften können in einem Stream gespeichert oder geladen werden aus einem Stream. Jeder Schlüssel und der entsprechende Wert in der Eigenschaftsliste ist ein String. ") –

Verwandte Themen