简体   繁体   中英

Java updating file reference after renaming

Hi there I have a problem dealing with some legacy code. I need a way to get the changed File from the parseFile() method up to the calling doWithFileList() method.

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

}

I know that File objects are immutable. The problem is in my real world problem the parseFile() method at the moment only does Step step 1-3 but I need to add step 4. The renaming is not a problem, but I need to get the new file name somehow to the calling method. in the real life problem there is bigger stack trace across multiple objects between those methods.

What would be the best way to get the changed name of the file back to the beginning of the the call hierarchy where I can change the object in the list. my best guess at the moment would be to create a ReturnObject that holds both the String to return and the new File object. But then I have to refactor a bunch of methods on my way up so I would need to create a bunch of different return objects.

The following possiblities come to mind:

  1. pass a mutable object, eg a new String[1] and set it there. (Mega-ugly, because you have side effects and not a pure function anymore) (On the other hand: you already have side-effects - go figure ;-))
  2. Use a generic return object like String[], a Map, a Pair-implementation that you can find in various utilities (eg org.colllib.datastruct.Pair)
  3. Use a hand-crafted return object

Personally, I'd probably go with (2), but it also might be (3)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM