Frage zum generellen Verständiss von OO an einem Beispiel

MasseElch

Aktives Mitglied
Hallo liebes Forum,

ich bin noch recht neu in Java und habe darum ein paar Verständnisprobleme.

Und zwar habe ich eine Klasse geschrieben, die aus einem gegeben Ordner alle mp3-Dateien rausholt und in eine Liste schreibt.

Java:
package model;

import java.io.File;
import java.util.ArrayList;

/**
 * gets a directory and reads all files in it and its subdirectories
 * fills an List with all mp3-file-path's 
 */
public class ReadNewDirectory {

	private ArrayList<String> mp3Locations;
	
	/**
	 * constructor
	 * @param dir - the directory chosen in JFileChooser
	 */
	public ReadNewDirectory(File dir) {
		
		this.mp3Locations = new ArrayList<String>();
		this.listDir(dir);
	}
	
	/**
	 * get every file in a directory and its subdirectories
	 */
	private void listDir(File dir) {

		File[] dirArr = dir.listFiles();
		if (dirArr != null) {
			for (int i = 0; i < dirArr.length; i++) {
				if (dirArr[i].isDirectory()) {
					listDir(dirArr[i]); // ruft sich selbst mit dem 
										// Unterverzeichnis als Parameter auf
				}else {
					if(dirArr[i].getName().endsWith("mp3"))
						this.mp3Locations.add(dirArr[i].getAbsolutePath());
				}
			}
		}
	}
}

Nun möchte ich, dass die Liste erweitert werden kann. Wenn also durch den FileChooser ein Ordner ausgewählt wird, dann schmeißt der Constructor ja alle mp3-Dateien in die Liste. Wähle ich jetzt mit dem FileChooser einen weiteren Ordner aus, dann wird doch eine neue Instanz und damit auch eine neue Liste angelegt und meine Variable überschrieben. Wie bekomme ich es hin, dass ich die Liste immer weiter erweitern kann?

Hier noch Mal der ButtonListener, der den JFileChooser aufruft:

Java:
if(source == GUI.this.buttonNewSource) {
				try {
					GUI.this.fileChooser.showOpenDialog(null);

					ReadNewDirectory topList = new ReadNewDirectory(GUI.this.fileChooser.getSelectedFile());
					System.out.println(topList);
					} catch (IOException e1) {
						JOptionPane.showMessageDialog(null, "Loading file failed", "Fehler", 0, null);
					}
			}
 
Zuletzt bearbeitet:
Wie bekomme ich es hin, dass ich die Liste immer weiter erweitern kann?
Du instanzierst ja auch immer eine neue Liste!
Java:
 this.mp3Locations = new ArrayList<String>();
Dann kann natürlich beim nächsten Durchlauf NICHT die Liste erweitert werden.

PS: Bei Collections nimmt man üblicherweise das Interface bei der Definition und nicht schon die Implementierungsklasse, bei dir also List<String> mp3Locations.
 
Das mit dem Interface wusste ich nicht, danke, hab ich geändert 🙂

Gibt das da einen Grund für? Also technisch? Oder ist das einfach nur Konvention?


Es ist natürlich möglich, die Liste nicht jedes Mal neu zu erzeugen, aber das Problem ist dann immer noch, dass ja jedes mal eine neue Instanz der Klasse erzeugt wird.

Und ich weiß nicht, was dann mit diesen irgendwie "nutzlosen" Objekten passiert? Die leben dann doch weiter, bis das Programm beendet wird und müllen den Speicher voll oder nicht?

Lg
 
Hi,

die Garbage Collection kümmert sich um das Aufräumen alter Instanzen die nicht mehr gebraucht werden.

Wenn du die topListe als Klassenvariable verwendest und die Methode addDirectory(File file) in ReadNewDirectory hinzufügst, kannst du deine Liste leicht erweitern.
 

Zurück
Oben