PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Interface: Entweder - oder



nighT
23.03.2011, 09:11
Hallo Leute,

ich habe die Aufgabe bekommen eine Kundenverwaltung zu programmieren. Am Anfang sollen alle Daten noch in eine Textdatei geschrieben werden (zu Testzwecken). Später sollen die Daten dann in eine Datenbank (Oracle, SQlite o.Ä.).
Nun wurde mir gesagt, ich soll das ganze über ein Interface realisieren.
Sprich:
Ich habe später 2 Klassen (KundeToTextfile und KundeToDatenbank). Beim Programmstart soll dann per Konstante o.Ä. festgelegt werden, ob die Informationen in das Textfile oder in die Datenbank kommen.

Könnt ihr mir sagen, wie ich das lösen kann? Wie ich die Auswahl (den Wert der Konsante) behandeln soll, um dann die eine oder die andere Klasse zu verwenden?

Kann ich das Interface direkt ansprechen und sagen, wie: "Wenn 1 dann verwende Textdatei und wenn 2 dann verwende Datenbank"? Das mir das Interface selbst dann die jeweilige Klasse antriggert?

Gruß nighT

bytepool
23.03.2011, 10:06
Hi,

ich habe beim lesen von deinem Post ein wenig das Gefuehl dass du entweder Java Interfaces nicht wirklich kennst, oder nicht verstanden hast. Die Aufgabenstellung scheint mir extrem deutlich, aber vielleicht programmier' ich auch schon zu lange.

Du hast ein DB Backend, was fuer eins ist voellig Wurscht, und dafuer sollst du ein Interface definieren, damit du bei der implementierung der Verwaltung nicht drum kuemmern musst wie das Backend aussieht.

Z.B. so in die Richtung:


public interface StorageBackend
{
public void write(String key, String data);
public String get(String key);
}

Dann kannst du dir zwei Klassen schreiben die das Interface unterschiedlich implementieren, die eine schreibt in eine Textdatei, die andere in die Datenbank, und der Client Code muss sich da keine Gedanken drum machen, dort benutzt du nur das Interface.

Edit:
Mach dich zum Thema Polymorphie schlau, wenn obiges noch nicht klar sein sollte.

mfg,
bytepool

nighT
23.03.2011, 10:41
Danke für deine Antwort.

Ich bin relativ neu in Java oder zumindest in der objektorientierten Programmierung und habe bisher noch nicht mit Interfaces gearbeitet.

Soweit habe ich alles schon aufgebaut. Das Interface existiert mit den nötigen Methoden und es wird (bisher) von einer Klasse KundeToTextfile implementiert.
Mein Problem ist nun nur: Wenn ich später eine zweite Klasse habe, weiß ich nicht, wie ich auf das Interface zugreifen soll. Die Klasse, die das Interface verwendet "kennt" im Normalfall die Klassen, die das Interface implementieren nicht. Oder liege ich da falsch?

Wie kann ich nun also aus der Klasse Kundenverwaltung auf das Interface zugreifen, sodass eine der beiden Klassen (die das Interface implementieren) verwendet wird?

bytepool
23.03.2011, 13:14
Hi,

ich dachte das waere offensichtlich:


class Account
{
StorageBackend myBackend;

public void setBackend(StorageBackend aBackend)
{
myBackend = aBackend;
}

public void doStuff()
{
// use myBackend here, after setBackend has been called
}
}

Du uebergibst deiner Verwaltungs (Account) Klasse das Backend das du benutzen willst als Objekt (welches das Interface StorageBackend implementiert). Das ist der Sinn der ganzen Sache.

Statt mit einer setter Methode ginge es natuerlich auch direkt im Konstruktor, aber ich bin eher ein Anhaenger obiger Strategie.

mfg,
bytepool

Plinzen
23.03.2011, 18:52
Eine weitere Möglichkeit wäre auch eine Factory, die dir dann eine konkrete Implementierung deines Interfaces zurückliefert.


public class DAOFactory {

public KundenBackendInterface getKundenBackend(){
return new KundenToTextImpl();
}

}


Aber nebenbei: Für einen Anfänger in OOP und Java ist das nicht triviales...
Vielleicht hilft dir dieser Link weiter, um eine Idee von einer guten Lösung zu erhalten:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

mfg