Ich arbeite schon länger an einem Medien-Management-System für eine Firma. Die erste stabile Version habe ich letztes Jahr fertiggestellt und arbeite nun wieder daran weiter. Eine der größeren Änderungen war die Umstellung der Konfigurationsdateien auf eine kompakte XML-Datei und das Einführen einer neuen Konfigurationsklasse. Allerdings hatte ich nicht viel Ahnung wie ich die am Besten statisch gestalten soll, da die Daten von überall verfügbar sein müssen und die Konfigurationsdateien doch nur einmal eingelesen werden sollen.
Deshalb habe ich daraus ein Singleton gemacht:
WFLConfReader.getInstance().meineMethode()
Ich bin damit allerdings nicht allzu zufrieden, da der Code dadurch sehr unübersichtlich werden kann. Der Oberhammer sind dann zB solche Zeilen:
WFLConfReader.getInstance().getWorkingDirectory( WFLConfReader.MT_NEWS )
Nun habe ich schon überlegt ob ich die Klasse nicht komplett statisch mache und die Konfigurationsdateien in einem static-Block einlesen lasse. Allerdings habe ich Bedenken dass das vlt. nicht unbedingt sauber ist …
ich handhabe das immer so wie du, aber die Sache mit den komplett statischen Methoden ist zwar nicht sauber aber in diesem Fall würde ich sagen dass es eine vertretbare Unschönheit ist.
Ich könnte natürlich noch eine Klassenvariable ‘conf’ in jeder Klasse einführen wo ich WFLConfReader mehrmals brauche. Ist das sinnvoll?
Quasi so: ```public class MeineKlasse {
private final static WFLConfReader conf = WFLConfReader.getInstance();
...
}```
ja das würd ich immer machen wenn du die Klasse mehr als einmal brauchst.
Mir ist gerade noch eine bessere Idee eingefallen. Meine Auftraggeber wollen nämlich, dass abhängig von der Abteilung des Benutzers eine andere Konfigurationsdatei verwendet werden soll. So wäre es nach meiner Überlegung am besten die ganze Klasse statisch zu machen und eine Art Initialisierungs-Methode einzuführen. Die würde dann genau einmal zu Beginn des Programms mit einem Parameter aufgerufen werden - nämlich mit der entsprechenden Konfigurationsdatei.
Damit wäre ich vorsichtig, weil was machst du wenn es heißt der Benutzer kann sich abmelden und dann kommt einer aus einer anderen Abteilung.
Dann lass es lieber beim Singleton oder einer Setupmethode.
anstatt immer sowas wie
MeineConfigClass.getInstance().getSomething("blaba")
kann man in der Config klasse auch eine statische methode getBlabla anbieten so dass der Aufrufer dann nur noch
MeineConfigClass.getBlablabla()
schreiben muss und befreit ist zu wissen wie nun die konstante heisst die im das Feld gibt.
so erhoeht sich zwar der Code in der Configklasse, aber der Aufrufer ist uebersichtlicher und intuitiver
Damit wäre ich vorsichtig, weil was machst du wenn es heißt der Benutzer kann sich abmelden und dann kommt einer aus einer anderen Abteilung.
Dann lass es lieber beim Singleton oder einer Setupmethode.
Das ist so nicht vorgesehen, da es nichteinmal möglich ist sich manuell einzuloggen. Jeder Benutzer wird automatisch anhand einer Umgebungsvariable erkannt (USERNAME).
Und selbst wenn das der Fall wäre; ich könnte noch einfach diesselbe Init-Methode nochmal mit einer neuen XML-Datei aufrufen, oder?
Ich hab noch nicht angefangen das ganze Programm umzubessern, noch ist es nicht zu spät ^^
@deathbyaclown
Dein Vorschlag gefällt mir eigentlich recht gut, das Problem sind jetzt leider die verschiedenen Konfigurationsdateien. Ich habe eine Authorisierungsklasse, diese wird allerdings nur in der Startklasse aufgerufen. Daher dachte ich an die statische Lösung mit Init-Methode …
Jep wenn du die Config neu einlesen willst musst du dann dafür sorgen dass diese Methode noch einmal aufrufbar ist.
Das mit der Authorisierungsklasse ist mir nicht ganz klar.
Jedenfalls bin ich mit der Lösung von deathbyaclown vertraut und halte sie für die Beste. Ich würde die Config nur einmal einlesen (Singleton), sonst kostet das viel zu viel Performance wenn die Benutzerzahl steigt. Außerdem erspart man sich so Probleme mit Virenscannern.
Außerdem denke ich ist es das Beste wenn man zwischen UserConfiguration und SystemConfiguration unterscheidet. Vererben kann man aufgrund des Singleton Patterns halt nicht mehr.
Grüße