Hallo,
ich kämpfe seit einigen Wochen mit einer guten Lösung für folgendes Problem:
Voraus, ich lasse "Sichtbarkeitskram" ala public, protected, private außen vor, da ich nicht wieß wie ich es machen soll.
Angenommen ich habe 2 Klassen nach folgender Struktur:
class ProjectConfig {
String owner = "unknown";
Managers managers = new Managers();
}class Managers {
String classLoaderManager = "ds.managers.ClassLoaderManager";
String classManager = "ds.managers.ClassManager";
String instanceManager = "ds.managers.InstanceManager";
}
Bist du sicher, dass die Klasse "Managers" statt "Manager" heißen soll? Ich bin leider nicht so sehr in diesem Thema drin, aber so wie du diese Strings speicherst, klingeln bei mir die Alarmglocken.
> Das ganze ist ja mehr oder weniger eine Baumstruktur.
Sehe das ähnlich wie Bernhard, sofern du nicht noch soetwas wie ds.foo.bar zusätzlich zu den ds.managers.sonstwas Einträgen hast, sieht es eher nach einer Liste aus. (Naja, andererseits kann man einen Baum mit einer Tiefe von 1 ggf. auch als Liste sehen...)
> Nun hätte ich es gerne so, dass ich aus dieser Basis heraus 2 verschiedene Klassentypen hätte:
> Einmal nur lesbar und einmal les- und schreibbar.
Was genau wird mit diesen Strings wie "ds.managers.ClassLoaderManager" passieren? Werden diese Klassen/Pakete irgendwie importiert oder so?
> Eine Variante wäre alle Member protected zu machen, ProjectConfig und Managers mit Getter-Funktionen auszustatten und daraus dann je eine Klasse mit Setter-Funktionen abzuleiten.
> Nun find ich das allerdings eine recht umständliche Lösung. Ich hätte es lieber so, dass ich nur eine schreib- und lesefähige "Hauptklasse" kreieren müsste und beliebig viele nur lesefähige Klassen bauen könnte.
Also ich würde jetzt aus dem Bauch heraus eher vorschlagen, dass du ein Interface "ConfigReadable" erstellst, in dem du die nötigen getter definierst. Daneben würde ich dann ein weiteres Interface "ConfigWritable" erstellen, was "Configreadable" implementiert und um Methoden zum Ändern der Daten definiert. Aber sauber erscheint mir das auch nicht...
> Ich könnte das ganze über ein Worterbuch a la List<String, Object> lösen, nachteil dabei ist aber, dass dann keine Vervollständigung per IDE möglich ist und im Endeffekt werden das um die 100 Schlüssel.
Wieso ist dann keine Vervollständigung möglich? Und warum das Object? Object sollte man möglichst vermeiden, wenn es nicht anders geht.
> Einfach interfaces mit Getter- bzw. Setter-Funktionen und die Klasse implementiert beide kommt nicht in Frage, da ein simples "umcasten" möglich ist. (Über Reflexion geht es zwar generell, aber das sollte außen vor bleiben)
Umcasten ist das allerletzte was man tun sollte und zwar dann, wenn man die Grenzen von Java gerät. Vielleicht braucht man ja gar keine Reflection, aber dafür solltest du genauer erklären, was du da tun willst.