2016-04-15 24 views
1

Hallo, ich habe ein Problem mit einigen Legacy-Code. Ich brauche einen Weg, um die geänderte Datei von der parseFile() -Methode bis zur aufrufenden doWithFileList() -Methode zu bekommen.Java Update Dateireferenz nach dem Umbenennen

public static void main(String[] args) throws IOException { 
    File file1 = File.createTempFile("file1", ".tmp"); 
    File file2 = File.createTempFile("file2", ".tmp"); 
    ArrayList<File> fileList = new ArrayList<File>(); 
    fileList.add(file1); 
    fileList.add(file2); 
    doWithFileList(fileList); 
} 

static void doWithFileList(List<File> fileList) { 
    for (File file : fileList) { 
     String result = parseFile(file); 
    } 
    //Do something with the (now incorrect) file objects 
    for (File file : fileList) { 
     // always false here 
     if (!file.exists()) { 
     System.out.println("File does not exist anymore"); 
     } 
    } 
} 

private static String parseFile(File file) { 
    //1. Get information from the File 
    //2. Use this information to load an object from the Database 
    //3. return some property of this object 
    //4. depending on another property of the DB object rename the file 
    file.renameTo(new File(file.getAbsoluteFile() + ".renamed")); 
    return "valueParsedFromFile"; 

} 

Ich weiß, dass Dateiobjekte unveränderlich sind. Das Problem ist in meiner realen Welt Problem die ParseFile() -Methode im Moment nur Schritte Schritt 1-3, aber ich muss Schritt 4 hinzufügen. Die Umbenennung ist kein Problem, aber ich muss den neuen Dateinamen irgendwie bekommen zu der aufrufenden Methode. im realen Leben gibt es größere Stack-Trace über mehrere Objekte zwischen diesen Methoden.

Was wäre der beste Weg, um den geänderten Namen der Datei an den Anfang der Aufrufhierarchie zurück zu bekommen, wo ich das Objekt in der Liste ändern kann. Meine beste Schätzung im Moment wäre es, ein ReturnObject zu erstellen, das sowohl den zurückzugebenden String als auch das neue File-Objekt enthält. Aber dann muss ich eine Reihe von Methoden auf meinem Weg nach oben umgestalten, so dass ich eine Menge verschiedener Rückgabeobjekte erstellen müsste.

Antwort

-1

Die folgenden Möglichkeiten in den Sinn kommen:

  1. ein veränderliches Objekt übergeben, z.B. eine neue Zeichenfolge [1] und legen Sie sie dort fest. (Mega-hässlich, weil du Nebenwirkungen hast und keine reine Funktion mehr) (Andererseits: du hast schon Nebenwirkungen - geh Figur ;-))
  2. Benutze ein generisches Return-Objekt wie String [], a Karte, eine Pair-Implementierung, die Sie in verschiedenen Dienstprogramme (zB org.colllib.datastruct.Pair)
  3. Verwenden Sie eine handgefertigte Rückgabeobjekt

persönlich finden können, würde ich wahrscheinlich gehen mit (2) , aber es könnte auch sein (3)

+0

Die 3 ist die einzige VALID-Lösung. 1 und 2 sind nur böse Dinge, die man in jedem professionellen Programm vermeiden sollte! Es ist unzuverlässig, schwer zu pflegen und lächerlich. Und die Arbeit auf dem größeren Stapel ist in allen Fällen gleich. Es versteht diese Antwort nicht ... –

-1

Die Verwendung einer ReturnObjet scheint die einzige Lösung zu sein, soweit ich weiß.

+0

Es gibt nie nur eine "gültige" Lösung. In der realen Welt müssen manchmal Einschränkungen wie Einfachheit, Zeit, Kosten, Anzahl der Code-Änderungen berücksichtigt werden, und wir können diese definitiv nicht aus der Ferne unterscheiden. – mtj