Подтвердить что ты не робот

Почему File.renameTo не меняет значение, на которое указывает файл?

File oldFile = new File("old");
if (oldFile.renameTo(new File("new"))){
    System.out.println(oldFile.getName());//this prints "old"
}

Я посмотрел источник openJDK, и функция renameTo (File dest) выглядит так:

public class File implements Serializable, Comparable<File> {
    static private FileSystem fs = FileSystem.getFileSystem();
    private String path;
    ...
    public boolean renameTo(File dest) {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite(path);
            security.checkWrite(dest.path);
        }
        return fs.rename(this, dest);
    }
    ...
}

Поэтому переменная пути никогда не изменяется. Почему это так? Каким будет правильный способ использования переименованной переменной File? В настоящее время я делаю это так:

File oldFile = new File("/home/blin/misk/old");
File newFile = new File("/home/blin/misk/new");
if (oldFile.renameTo(newFile)){
    oldFile=newFile;
    System.out.println(oldFile.getName());//this prints "new"
}
4b9b3361

Ответ 1

Самое простое объяснение состоит в том, что, цитируя Javadoc:

Экземпляры класса File неизменяемы; то есть после создания абстрактного пути, представленного объектом File, никогда не изменится.

Как говорили другие, здесь нет никакого права или неправды. Однако, как только разработчики библиотеки сделали выбор выше, текущее поведение renameTo стало единственным возможным.

Что касается второго фрагмента кода, я не вижу в нем недостатков.

Ответ 2

Объект File - это просто имя, оно даже не должно существовать. Вызов renameTo API фактически переименовывает файл в файловой системе, но не изменяет объект File, потому что это то, что разработан API. здесь нет правильного или неправильного. дизайнеры API в Sun подумали, что это имеет больше смысла.

Ответ 3

От быстрого взгляда на файл он выглядит как неизменный. У него есть некоторые сеттеры, но они работают на фактическом файле в файловой системе, а не на экземпляре File.

Поэтому переименовать не изменяя текущий экземпляр, сохраняет тот же стиль.