2016-04-15 44 views
1

嗨,我有一個處理一些遺留代碼的問題。 我需要一種方法來從parseFile()方法獲取更改的文件直到調用doWithFileList()方法。重命名後Java更新文件引用

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"; 

} 

我知道File對象是不可變的。 問題是在我的現實世界問題parseFile()方法在此刻只做步驟1-3,但我需要添加步驟4. 重命名不是問題,但我需要以某種方式獲取新的文件名到調用方法。 在現實生活中,這些方法之間的多個對象之間存在較大的堆棧跟蹤。

什麼是最好的方式來獲取文件的改變名稱回到調用層次的開始,我可以改變列表中的對象。 我現在最好的猜測是創建一個ReturnObject,它包含要返回的字符串和新的File對象。但是之後我不得不在重新構造一堆方法,所以我需要創建一堆不同的返回對象。

回答

-1

以下possiblities想到:

  1. 傳遞一個可變對象,例如一個新的String [1]並將其設置在那裏。 (超級醜,因爲你有副作用,而不是純功能)(另一方面:你已經有副作用 - 去圖;-))
  2. 使用一個通用的返回對象,如String [],a地圖,你可以在各種工具找到一對執行方式(例如org.colllib.datastruct.Pair)
  3. 使用手工製作的返回對象

就個人而言,我可能會用走(2) ,但它也可能是(3)

+0

3是唯一有效的解決方案。 1和2在任何專業程序中都是非常危險的事情!這是不可靠的,難以維持和流行。而且,在更大的堆棧上完成的工作在所有情況下都是相同的。它不明白這個答案... –

-1

據我所知,使用ReturnObjet似乎是唯一的解決方案。

+0

從來沒有隻有一個「有效」的解決方案。在現實世界中,有時候需要考慮簡單性,時間,成本,代碼變更次數等約束條件,而且我們絕對無法從遠處看出這些變化。 – mtj