MichiLee: MichiLee

Beitrag lesen

Hi Peter,

super vielen Dank, dann habe ich das auch verstanden. Vielen vielen Dank.
Mich hatten die Hashtables etwas verwirrt, was die Referenzierung betrifft.

Dürfte ich dann gleich noch ein paar kleine Fragen zu Java loswerden.

Ich habe ein Interface Datasource. Dann habe ich zum Beispiel zwei Klassen DataDB und DataXML welches Datasource implementiert.
Nun habe ich eine Klasse DatasourceFactory welche entscheidet, mit was eine Datasource erzeugt wird (entweder DataDB oder DataXML) und gibt dann das erzeugte Datasource zurück.

Nun kann man von anderen Klassen von der DatasourceFactory ein getInstance() holen, wo ich dann eine Verbindung zur Datenbank (DataDB) oder einer XML-Datei (DataXML) habe.

Meine Fragen nun:

1. Ich könnte die DatasourceFactory ja statisch machen, mit statischen Klassenvariablen zum Beispiel für Parameter und dem Typ ob DB oder XML)

private static String typ = null;
privat static String parameter = null;

Dann könnte man in einer anderen Klasse die Methode init von DatasourceFactory aufrufen, welche die zwei Klassenvariablen füllt mit DatasourceFactory.TYP="DB"
Danach könnte man die Methoden statisch aufrufen. Normalerweise wird die DatasourceFactory auch nur von einer bestimmte Klasse aufgerufen. Könnte aber sein, dass andere Klassen das auch aufrufen.
Nun frage ich mich, wie sich das mit den Klassenvariablen verhält, wenn später eine andere Klasse darauf zugreift. Muss man irgendwie synchronisieren?

(Wenn das eine Applikation im Internetbetrieb wäre, wo mehrere Leute auf die Klassen/Klassenvariable zugreifen, wäre der Inhalt der Klassenvariablen ja egal, da es ja für jeden Benutzer, der auf die Klassenvariablen zugreift ja eh in einem eigenen Thread arbeitet oder? Oder überschreiben die sich irgendwie das hin und her?)

2. Für Commandos für DB(SQL) oder XML, die gebraucht werden, um irgendwelche Daten zu laden, schreibe ich dann ein eigenes Interface Commando, wo dann bestimmte Methoden vorgeschrieben werden, wie zum Beispiel public User getUser(int i)... Praktisch alle Daten, die die Applikation braucht werden hier vorgeschrieben. Eine CommandoDB implementiert dann diese Methode, um baut darauf ein Kommando zusammen. Die ganzen Models könnten dann das Interface ansprechen und sagen, dass sie einen User wollen, welches sie dann auch zurückkriegen.
Die CommandoDB nutzt dann evtl. die DatasourceFactory von oben um gleich das Kommando auch auszuführen oder gibt anstatt den User nur das Commando zurück, so dass das Model mit dem Commando auf DatasourceFactory zugreift.

Findet ihr diese Lösung akzeptabel? (Unser Lehrer schlug vor, anstatt oben eine DataDB zu haben, dass man das für jede Bereiche einzeln macht, bsp. DataUserDB, DataProjektDB, so dass die einzelnen Klassen dann jeweils einen User laden, editieren, löschen usw.

3. Meine letzte kleine Frage wäre, wenn ich zum Beispiel wie in Frage 1 in irgend einem Model von DatasourceFactory eine Datasource zurückkriege, was mit DataDB gebildet wurde, kann ich ja problemlos bsp. openSource() oder connect() aufrufen auf das Objekt, was von DataDB und DataXML implementiert wurde. Was wäre aber, wenn DataDB irgend eine spezielle Methode hätte, zum Beispiel isConnected(), was von Datasource nicht vorgeschrieben wurde, da es DataXML nicht braucht.
Ich hätte dann in DataDB die Methode isConnected() eingefügt, kann sie aber nich nutzen, da das Objekt so Datasource test = new DataDB() gebildet wurde und Datasource nicht die Methode isConnected hat?
Sowas geht dann allgemein nicht ne? Deshalb müsste ich mir von Anfang an überlegen, so dass es nicht so zu Überlappungen kommt ne?

Viele Grüße
Taner