Properties verwalten!

Status
Nicht offen für weitere Antworten.

ymene

Bekanntes Mitglied
Hallo zusammen,

seit geraumer Zeit beschäftige ich mich mit dem Thema Properties und versuche diese nach und nach in eine vorhandene Applikation zu implementieren. Ich habe mich dabei für die apache.commons.configuration API entschieden, da diese einfach zu handhaben und sämtliche Datenformate unterstützt, sollten sich diese mal ändern.

Viele Teilaspekte habe ich beim Durcharbeiten des How'to schnell verstanden, jedoch fehlt mir offenbar der letzte Funke für das Große & Ganze. Ich hoffe ihr könnt mir helfen. Und zwar geht es darum, wie ich die Properties letztendlich verwalte.

Möglichkeit 1:
Ist es sinnvoll sich vorweg eine Default-Properties Klasse zu schreiben, die alle Properties von vornerein einmal in ein default.properties-File schreibt und dann aufbauend auf diesem Propertyfile man zur Laufzeit einfach via setProperty die Werte zuweist? Nachteil wäre, dass sich diese Variante nicht so leicht pflegen lässt, da jede Änderung immer gleich an zwei Stellen vorgenommen werden müsste. oder

Möglichkeit 2:
Baut man zur Laufzeit ein Propertyfile auf, womöglich mit einem eigenen überschriebenen setter, welcher zunächst prüft, ob dieses Property bereits vorhanden ist. Falls nicht, lege dieses Property im File an, falls doch, setze es einfach auf den übergebenen Wert? Hier wäre der Nachteil, dass sich die Verwaltung unterschiedlicher Property-Files dadurch etwas erschwert, da diese je nach Abfolge unterschiedlicher Aufrufe anders strukturiert sein können.

Das Ganze gestaltet sich nicht so einfach, da ich Properties, wie default, "last-used" und userspezifische Properties unterstützen möchte, daher hoffe ich, dass ich meinen Gewissenskonflikt ausgiebig darstellen konnte und ihr mir vielleicht einen Ansatz geben könnt, um mich ein Wenig in die richtige Spur zu leiten.

Vielen Dank,
ymene
 
Wenn ein Value von einem key (Property) default ist, warum dann überhaupt in eine Datei Speichern?

Einfaches Beispiel (pseudo code):

Code:
public static final String KEY_FULLSCREEN="fullscreen";
public static final boolean DEFAULT_FULLSSCREEN="false";

PropertiesCOnfiguration conf = new PropertiesConfiguration();
conf.load(InputStream);

boolean full = conf.getBoolean(KEY_FULLSCREEN, DEFAULT_FULLSCREEN);

Wenn nicht eingetragen, dann nimm default Wert.
Setzt du ein Property, dann speichere die Propertiesdatei danach (an synchronized denken).

Ansonsten bietet es ich weiter an, den Configurator als Singleton anzulegen.

regards
eliot
 
Danke eliot für die Anregungen.

Singleton halte ich hierbei auch auf jeden Fall für sinnvoll und hab ich auch so implementiert.

Dennoch ist mir so einiges nicht ganz klar:

Zum Thema default.properties, diese wollte ich z.b. für etwas nutzen wie "ResetPreferencesToDefault" (ich vergleichs immer gerne mit: "Auf Werkseinstellungen zurücksetzen") oder ähnliches. Dort kann ich ihm ja nicht automatisch sagen, er solle den Default-Wert einer Property nehmen, da ein valid-Wert in der richtigen Config ja auf jeden Fall vorhanden ist, und er gar nicht erst auf den Default zurückgreifen wird. Daher muss ich eine Default.Properties zumindest irgendwo anlegen, welche nicht weiter veränderlich ist.

Beispiel:

Code:
conf.getBoolean(KEY_FULLSCREEN, DEFAULT_FULLSCREEN);

KEY_FULLSCREEN ist in der Userproperty auf jeden Fall vorhanden, also ist kein zugriff auf DEFAULT_FULLSCREEN möglich, oder übersehe ich hierbei etwas?

Was das Speichern betrifft: Soll man dieses wirklich nach jedem setzen einer Property durchführen? Es gäbe ja auch die Möglichkeit autosave zu nutzen in apache.commons.configuration. Jedoch hab ich gelesen, dass man davon abrät, damit er nicht ständig im File am schreiben ist. Derzeit hab ich es so implementiert, dass er die Properties erst in einem Shutdownhook in einem Propertyfile speichert, und wollte zusätzlich evtl. implementieren, dass sie zumindest nach jedem View-Wechsel persistent gehalten werden.

Kannst du mir vielleicht noch mal kurz erläutern, warum synchronized in diesem Zusammenhang wichtig ist?

Danke nochmals,
ymene
 
Synchronized aus dem Grund, dass nicht zwei Threads gleichzeitig speichern und dadurch am Ende Müll in der Config steht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben