String Variable verändert sich plötzlich

Jesfreric

Aktives Mitglied
Liebe Community

Ich stehe mal wieder vor einem Rätsel. Ich habe eine Klasse mir dem Namen "FileEdit".
Beim Erstellen eines Objektes wird dem Konstruktur hierbei einfach nur der Dateipfad zu einer Datei übergeben. Ich habe mehrere Methoden dazu erstellt
readFile()
writeFile()
deleteFile()
Soweit funktioniert alles super, allerdings habe ich eine sehr eigenartige Entdeckung gemacht.
Ich habe 2 Objekte der Klasse FileEdit erstellt
1. orgsumFile
2. chosenSeqFile
Das Eigenartige ist nun folgendes…

Java:
System.out.println( orgsumFile.readFile() );
FileEdit chosenSeqFile = new chosenSeqFile( "Pfad" );
System.out.println( orgsumFile.readFile() );

Die Ausgabe von Line 1 entspricht dem Inhalt von Datei 1. Die Ausgabe von Line 3 allerdings dem Inhalt der neuen Datei "chosenSeqFile".
Wo liegt mein Denkfehler?

Die readFile() Methode schaut so aus:
Java:
public static String readFile() throws IOException{
   String content = new String("");
   FileReader fr = new FileReader( filePath );
   BufferedReader br = new BufferedReader(fr);
   String line = "";

   while( (line = br.readLine() ) != null ){
      content = content + "\n" + line;
   }
  
   br.close();
   return content;

}

Muss ich den "BufferedReader" erst irgendwie leeren?

Viele Grüße
Richi
 
Zuletzt bearbeitet:
In der Methode "readFile" verwendest du ein Attribut "filePath".
Dieses Attribut ist wahrscheinlich static definiert, daher haben alle deine Objekte der Klasse "FileEdit" denselben "filePath".

Ich verstehe auch nicht warum deine Methode "readFile" static ist.

Entferne einfach deine static und es sollte funktionieren.
Warum static in diesem Fall falsch ist lernt man bei den Grundlagen der OOP, diese zu lernen kann dir aber keiner abnehmen 😉
 
Ich denke auch, was Joose gesagt hat ist der Grund. Allerdings finde ich nicht, dass es falsch ist so eine Methode static zu machen. Für Utility Methoden bietet sich das meiner Meinung nach an. Hier könnte man einfach den Pfad als Parameter der Methode mitgeben. Das mag natürlich jeder anders sehen...
 
Ich denke auch, was Joose gesagt hat ist der Grund. Allerdings finde ich nicht, dass es falsch ist so eine Methode static zu machen. Für Utility Methoden bietet sich das meiner Meinung nach an. Hier könnte man einfach den Pfad als Parameter der Methode mitgeben. Das mag natürlich jeder anders sehen...

Und was passiert dann wenn zwei Threads gleichzeitig auf die Methode zugreifen?

Gruß

Claus
 
Sobald ich das static entfernt habe, hat es super funktioniert.=)
Dankeschön=)

Das heißt beim static wird der Klassenvariable also einmal ein Wert übergeben, den sie sich dann "merkt?". Dauerhaft, oder nur bis die Referenzen aller Objekte dieser Klasse gelöscht wurden (falls ich in meinem Skript die Objekte alle lösche und später neu aufrufe)...

Viele Grüße
Richi
 
Allerdings finde ich nicht, dass es falsch ist so eine Methode static zu machen. Für Utility Methoden bietet sich das meiner Meinung nach an.
Hier könnte man einfach den Pfad als Parameter der Methode mitgeben. Das mag natürlich jeder anders sehen...

Klar bei Utility Methoden kein Problem. Aber er will es hier im Zusammenhang mit einem Objekt verwenden.
Und dem Anfangspost entnehme ich das er mehrere Objekte seiner Klasse erstellen will und somit auch mehrere Files einlesen muss.

Und was passiert dann wenn zwei Threads gleichzeitig auf die Methode zugreifen?

Hier gibt es kein Problem mit mehreren Threads. In der Methode wird nur der "filepath" gemeinsam verwendet und dieser auch nur lesend. Sprich diese Methode kann von mehreren Threads ohne Probleme ausgeführt werden (abgesehen vom komischen Verhalten und vl Problemen mit nicht vorhandenen Files etc.)


Das heißt beim static wird der Klassenvariable also einmal ein Wert übergeben, den sie sich dann "merkt?". Dauerhaft, oder nur bis die Referenzen aller Objekte dieser Klasse gelöscht wurden (falls ich in meinem Skript die Objekte alle lösche und später neu aufrufe)...

Java - static einfach mal durchlesen und bei Fragen wieder melden.
 
Zuletzt bearbeitet:
Hier gibt es kein Problem mit mehreren Threads. In der Methode wird nur der "filepath" gemeinsam verwendet und dieser auch nur lesend. Sprich diese Methode kann von mehreren Threads ohne Probleme ausgeführt werden (abgesehen vom komischen Verhalten und vl Problemen mit nicht vorhandenen Files etc.)

Das klappt solange bis er in der Methode dann doch noch einmal erweitert. Ich finde auch Utility Methoden kann man in eine eigene Utiiity-Klasse packen und diese eben kurz instanzieren wenn man sie braucht. Der damit verbundene Overhead ist zu vernachlässigen, wenn man im Gegenzug die Probleme berücksichtigt die einem Statics auf die Dauer einbringen können.

Gruß

Claus
 
wenn man im Gegenzug die Probleme berücksichtigt die einem Statics auf die Dauer einbringen können.
Das mit 'static' scheint ja fast eine Glaubensfrage X-)
Ich bin da ziemlich diametral gegenüber zu Claus' Vorgehen: Ich mach' alle Methoden 'static', die nicht auf Objektattribute zugreifen (also praktisch alles, was dann keine Fehlermeldung erzeugt). Von "Probleme, die einem Statics auf die Dauer einbringen" merke ich bisher praktisch nichts.
 
Das klappt solange bis er in der Methode dann doch noch einmal erweitert. Ich finde auch Utility Methoden kann man in eine eigene Utiiity-Klasse packen und diese eben kurz instanzieren wenn man sie braucht. Der damit verbundene Overhead ist zu vernachlässigen, wenn man im Gegenzug die Probleme berücksichtigt die einem Statics auf die Dauer einbringen können.

Gruß

Claus
Sehe ich nicht so. Wenn ich mehrere Theads verwende, dann ist Synchronisation ohnehin ein Thema. Mit oder ohne Static. Aber dann jedem Thread das komplette Datenpaket in die Tasche zu stecken, ist auch nicht immer der richtige Weg. Besonders wenn es dann viele Threads werden...
Da Synchronisiere ich persönlich dann lieber.
 

Zurück
Oben