eigene Klasse durch Composition mit java.io.File erweitern

mandypb86

Mitglied
Hallo zusammen,

ich steh grad aufm Schlauch.

Hab mich jetzt soweit durchs Netz gelesen, dass ich mir sicher bin für meine Zwecke, die Composition nutzen zu müssen/können, doch hab grad noch keinen genauen Plan, wie ich das anstellen soll.

Ich möchte in meinem Programm (übrigens eclipse RCP, falls das hier eine Rolle spielt) mittels eines TreeViewers durch das lokale Filesystem browsen, dabei aber nur Directories und ganz bestimmte Dateien anzeigen lassen.

Diese ganz bestimmten Dateien (nennen wir sie mal Lieddateien) sind im Grunde auch nichts anderes als ganz normale Dateien. Ich kenne aber die genaue Struktur der bytes in diesen Dateien und möchte ihnen eine eigene Klasse geben, um mit anderen eigenen Methoden weiter drauf zugreifen zu können (z.B. Anzeigen von bestimmten Werten, die ich aus den bytes auslesen kann oder später auch Editieren bestimmter Inhalte dieser Dateien).

Der Filebrowser (ein TreeViewer mit TreeColumns) soll aber trotzdem noch ganz normal die Directories aufklappen und deren Unterelemente anzeigen sprich getChildren() usw.

Wie verbinde ich das jetzt am geschicktesten?

Was mir vor allem Sorgen macht, ist die Methode listFiles() aus java.io.File. Diese liefert ja File[] zurück, was ich bräuchte, wäre aber Song[] (meine Lieddateien).

Gefiltert mittels eines ViewerFilters hatte ich die Dateien schon (mittels auslesen der ersten 64 bytes, die diese Dateien erkennbar machen), nur das Anzeigen der spezifischen Variablen im Viewer ging natürlich nicht, da ich von File auf Song nicht so einfach casten kann. Daher kam die Idee mit der Composition.

Jemand nen Hinweis oder ne Idee für mich?

Schonmal vielen Dank im Voraus

M@ndy
 
Am Besten machst du dir eine Methode [c]listSongs()[/c]. [c]Song[/c] sollte einen Konstruktor [c]Song(File)[/c] kennen (natürlich kann z.B. auch eine [c]URI[/c] verlangt werden, aber das kann man alles bereits [c]File[/c] übergeben) und evtl. eine statische Methode zur Überprüfung eines Files kennen (und natürlich von [c]File[/c] erben...).

Hier ein Beispiel:

Java:
public class Song extends File {

    public Song(File file) {
        super(file.toURI()); // Aufruf von File(URI)
    }

    public List<Song> listSongs() { // natürlich kann man auch Song[] zurückgeben...
        List<Song> songs = new LinkedList<Song>();
        for (File file : listFiles()) {
            if (Song.isSong(file)) {
                songs.add(new Song(file));
            }
        }
        return songs;
    }

    public static boolean isSong(File file) {
        return file.getName().endsWith(".foo"); // was du auch immer prüfen willst
    }
}
 
Zuletzt bearbeitet:
Hallo faetzminator,

von File zu erben wollte ich eben vermeiden, da es an anderer Stelle nicht empfohlen wird, daher wollte ich ja die Composition verwenden, sprich nur eine Referenzvariable auf File nutzen.

Eine listSongs()-Methode wie du sie vorschlägst, in Kombination mit einer isSong Abfrage klingt erstmal vernünftig.

Ich stelle mir das ungefähr so vor:

Java:
class Song{
  File file;
  
  public Song(byte[] ihv, File file) // das übergebene byte[] enthält hier meine Informationen, die ich auslese
  {
    this.file = file;
  }

  public Song[] listSongs(){
    File[] files = this.file.listFiles();
    Song[] songs = new Song[files.length];
    
/*
    und von dort irgendwie weiter
    vllt für alle gefundenen Files einen neuen Song erstellen und mit new Song(files[i]) erzeugen
*/
    Song possibleSong;
    for(int i=0;i<files.length;i++){
      possibleSong = readFile(files[i].getName());
      if (!possibleSong==null){
        songs[i] = possibleSong;
      }
    }
     return songs[];
  }

  private Song readFile(String filename){
    // lese erste 64 bytes und prüfe daran, ob es sich um einen Song handelt
    // wenn ja, liefere den neu erstellten Song zurück, der mit dem byte[] und dem File (aus filename) erstellt wird
    // sonst null
  }
}

Könnte das so erstmal funktionieren?

Aber was mach ich dann mit den Directories, die ich zwangsläufig brauche, um weiter durch den Tree zu navigieren.
Abfragen könnte ich sie ja, aber wie behandel ich die dann? Als Song geht ja schlecht.
 
Wie gesagt, mit meiner (und dem in dir verlinkten Thread geposteten) Idee funktioniert das.
Aber stimmt, das hab ich irgendwie missverstanden. Du kannst natürlich wieder das selbe machen, aber das [c]file[/c] vom Konstruktor intern verwalten. Kommt fast auf das gleiche raus, du musst einfach entweder ein [c]getFile()[/c] anbieten oder die Methoden von [c]File[/c] implementieren (bzw. evtl. dahin delegieren).
Edit: deine Idee mit dem [c]null[/c]-Check würde zwar korrekt implementiert funktionieren, aber ist etwas unschön. Lieber zuerst überprüfen und einen boolean zurückgeben.
 

Neue Themen


Zurück
Oben