Brauche Hilfe bei interfaces für Java

andy_pb

Grünschnabel
Hi, brauche Hilfe, und zwar suche ich ein Beispiel(Quellcode) oder Hilfe wie ich mit Interfaces arbeiten kann. Ich habe eine Klasse, welche eine Properties-Datei ausliest(Inhalt sind Variablen zum auslesen einer Datenbank). Über das interface IProperties, wo das Interface IJRunner extends IProperties, ist ein weiteres Interface IDataSource extends IJRunner, welche die Klasse Connect anspricht, die anhand der Variablen die Datenbankdaten ausliest. An IJRunner ist das Interface IDataTarget extends JRunner die Klasse DataTarget welche die gewonnen Daten abspeichert.
Grus
 
Zuletzt bearbeitet:
Ok .. ungefähr nach dem ersten Drittel deines Satzes habe ich aufgehört zu versuchen zu versteh was du meinst .. :)

Vielleicht noch mal das ganze strukturiert ?
 
Vorrangig stelle ich an andy_pb die Fragen:
- Weißt Du überhaupt, was ein Interface ist bzw. wozu es benötigt wird?
- Bist Du sicher, dass Du Interfaces brauchst?
 
Das Thema interfaces ist für mich Neuland da ich bisher vorwiegend zusammenhängende Programme geschrieben habe, aber dieses Programm soll so eine Art Datenpumpe von einer Datenquelle zu einer anderen sein, und soll leider modular sein. Der Vorteil ist dann, das man nicht ein neues Programm schreibt, wenn sich die Datenquelle oder das Datenziel ändert.
 
Moin,
also Du brauchst sowas wie eine Datenbankschnittstelle, OK. Dann leg mal los. :)
Definiere die Methoden, die jeder benutzen muss, der auf die Datenbank zugreifen möchte, in dem Interface. Lass dann alle Klassen, von denen auf diese Schnittstelle zugegriffen werden soll, dieses Interface und damit zwangsläufig die Interfacemethoden implementieren. Das ist alles. Ein typisches Beispiel für eine Interface-Implementierung sind die Listener.
 
Es funktioniert soweit das ich im Interface(IConfig) Variablen festgelegt habe, und mit der Klasse ConnectNotes darauf zugreife und die Datenbank auslesen kann. An das Interface IConfig ist das Interface IJobRunner extends IConfig, und noch ein Interface IDataSource extends IJobRunner, welches obengenannte Klasse ConnectNotes implementiert. Da aber auf der anderen Seite an IJobRunner ein Interface IDataTarget extends IJobRunner hängt, welches von der Klasse FTP-Server implementiert wird, ist mein Problem die Daten von ConnectNotes nach FTP-Server zu bekommen.
 
Guten Tag!

Also... ich habe zwar nur einen Teil von deiner Problembeschreibung verstanden, aber ich hoffe, ich kann dir anhand eines kleinen Beispiels weiterhelfen!

Thema Filme....

Quelle (Werte):
Filmname, Filmlaenge, Filmformat...

+filmname: String
+filmlaenge: long
+filmformat: String

Also... ich habe drei Daten.. die Quelle ist mir vorerst egal
Jetzt kommt mein Interface ins Spiel:

public interface FilmDaten
{
String getFilmName(String deineKriterien)//kann auch ein Selectstatement sein oder
//eine Id oder was auch immer (daher String)...
throws Exception;

long getFilmLaenge(String filmname)
throws Exception;

String getFilmFormat(String filmname)
throws Exception;
}

--> Jetzt habe ich also eine Schnittstelle die unabhängig von der Datenquelle ist.
zB. Eine Datei

/*
* Good Will Hunting
* 432000
* DVD
*/

public class FileFilmDaten implements FilmDaten
{
public String getFilmName(String pfadUndDateiname)
throws IOException
{
File f = new File(pfadUndDateiname);
FileInputStream fIn = new FileInputStream(f);
StringBuffer result = new StringBuffer();

//getFilmname -- > in erster Zeile...
for(int i=fIn.read();i>=0;i=fIn.read())
{
result.append((char)i);
if(i==(int)'\r'||i==(int)'\n') // nächste Zeile...
{
break;
}//end if
}
return result.toString;
}

//... Alle Methoden müssen hier implementiert werden...
}

--> Diese implementierende Klasse kann ich nun verwenden... Aber ich spreche sie über den Namen des Interface an um unabhängig zu bleiben....

public class KeineAhnungWieIchSieNennenSoll
{
public static void main(String[] args)
{
FilmDaten filmDaten = new FileFilmDaten();
//FilmDaten filmDaten = new SQLFilmDaten();
//FilmDaten filmDaten = new StreamFilmDaten();
//FilmDaten filmDaten = new InternetFilmDaten();
//Mit Hilfe des Interfaces kannst du nun viele implementierende Klassen verwenden um
//an die Daten zu kommen....
try
{
String filmName = filmDaten.getFilmName(args[0]);
System.out.println("Name: "+filmName);
System.out.println("Länge: "+filmDaten.getFilmLaenge(filmName));
System.out.println("Format: "+filmDaten.getFilmFormat(filmName));
}
catch(Exception e)
{
System.out.println("Fehler beim Auslesen der Daten....");
e.printStackTrace();
}
}
}

Ich hoffe das hilft :confused:
 
Achso... mit Hilfe von Reflection kannst du sogar noch mehr Unabhängigkeit erreichen...

Beispiel:
Code:
public class IchWeissImmernochNichtWieSieHeissenSoll
{
  public static void main(String[] args)
    throws Exception
  {
    FilmDaten f = Class.forName(args[0]).newInstance();
    //Wirft java.lang.ClassNotFoundException... falls die Klasse nicht gefunden wurde
    //Beachte, dass das Run Directory richtig ist (z.B. C:\java\Filme\)
    //das Argument muss voll qualifiziert sein...x.y.FileFilmDaten.java
    //Package + Klassenname.

    String filmName = f.getFilmName(args[1]);
    f.getFilmLaenge(filmName);
    f.getFilmFormat(filmName);
  }
}


So muss die Klasse nicht bekannt sein.. .das heißt, dass sie auch nachträglich einfach eingefügt werden kann.... Völlig Unabhängig!
 
Zurück