2016-04-15 16 views
1

こんにちは名前を変更した後、私はいくつかのレガシーコードを扱う問題を抱えています。 は私が呼び出し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オブジェクトが不変であることを知っています。 問題が私の現実世界の問題であり、現時点で構文解析ファイル()メソッドは、ステップステップ1-3を行いますが、私はステップ4 に名前変更を追加する必要が問題ではありませんが、私は何とか新しいファイル名を取得する必要があります呼び出しメソッドに渡します。これらの方法の間の複数のオブジェクト間で大きなスタックトレースがある現実の問題で 。

ファイルの変更された名前を、リスト内のオブジェクトを変更できるコール階層の先頭に戻すには、どのような方法が最適でしょうか。 現時点では私の最高の推測では、返される文字列と新しいFileオブジェクトの両方を保持しているReturnObjectを作成することです。しかし、その後私は途中でたくさんのメソッドをリファクタリングしなければならないので、たくさんの異なるリターンオブジェクトを作成する必要があります。

答えて

-1

以下possiblitiesは頭に浮かぶ:

  1. 例えば、変更可能なオブジェクトを渡します新しいString [1]を設定し、そこに設定します。 (あなたは副作用があり、もはや純粋な関数ではないのでメガ醜いです)(一方で、既に副作用があります;-))
  2. String []、a地図、あなたは様々なユーティリティで見つけることができますペア-実装(例えばorg.colllib.datastruct.Pair)
  3. は手作りのリターンオブジェクト個人的に

を使用して、私はおそらく(2)と一緒に行きたいです(3)

+0

3は、唯一の有効な解決策です。 1と2はプロフェッショナルなプログラムでは避けるべき悪いことです!それは信頼性が低く、維持するのが難しく、sloooowwです。より大きなスタックで実行される作業は、すべてのケースで同じです。この答えを理解できません... –

-1

私が知る限り、ReturnObjetを使用しているようです。

+0

「有効な」ソリューションは1つしかありません。現実の世界では、シンプルさ、時間、コスト、コード変更の回数などの制約が考慮されなければならない場合があります。 – mtj

関連する問題