arison.jp arison.jp blog - 現在をたのしく、未来をたのしむ。日常の思い出兼備忘録。

【Java】Fileクラスは不変(immutable)クラス

Fileクラスは不変(immutable)なクラスであり、一度生成したら状態が決して変更されることがない設計。
「FileクラスがJDK1.0の時代からある古いクラスだからか」とリンク先には書かれています。

JavaのFileクラスは不変(immutable)クラスという点に関する注意点 – 達人プログラマーを目指して
http://d.hatena.ne.jp/ryoasai/20110711/1310387741

package jp.arison;

import java.io.File;
import java.io.IOException;

public class FileTest {

    /**
     * Fileクラスは不変(immutable)なクラスってことを確認する
     *
     * @throws IOException 例外
     */
    public void renameTest() throws IOException {
        File srcFile = new File("temp.txt");
        File targetFile = new File("temp2.txt");

        if (srcFile.createNewFile()) {
            System.out.println(srcFile.getName() + "作成しました。(ファイルシステム上に作成されてる)");
        }

        if (srcFile.renameTo(targetFile)) {
            // Fileクラスのオブジェクトに対応していたファイルの名前がファイルシステム上で変更されます。
            System.out.println(targetFile.getName() + "リネームしました。(ファイルシステム上で変更されてる)");
        }
        System.out.println("");
        System.out.println("ここでFileクラスのgetName()を確認");
        System.out.println("srcFile.getName() :" + srcFile.getName());
        System.out.println("targetFile.getName() :" + targetFile.getName());

        System.out.println("");
        System.out.println("srcFile.delete() で削除してみる");
        if (srcFile.delete()) {
            System.out.println(srcFile.getName() + "消せました。(ファイルシステム上で削除されてる)");
        } else {
            System.out.println(srcFile.getName() + "消せません。");
        }

        System.out.println("");
        System.out.println("targetFile.delete() で削除してみる");
        if (targetFile.delete()) {
            System.out.println(targetFile.getName() + "消せました。(ファイルシステム上で削除されてる)");
        } else {
            System.out.println(targetFile.getName() + "消せません。");
        }
        System.out.println("");
        System.out.println("なるほど、renameTo()しても、 getName()の値は変わらない");
        System.out.println("Fileクラスは不変(immutable)なクラスってことで");
        System.out.println("一度生成したら状態が決して変更されることがない設計ってわけか");
    }
}

【実行結果】

temp.txt作成しました。(ファイルシステム上に作成されてる)
temp2.txtリネームしました。(ファイルシステム上で変更されてる)

ここでFileクラスのgetName()を確認
srcFile.getName() :temp.txt
targetFile.getName() :temp2.txt

srcFile.delete() で削除してみる
temp.txt消せません。

targetFile.delete() で削除してみる
temp2.txt消せました。(ファイルシステム上で削除されてる)

なるほど、renameTo()しても、 getName()の値は変わらない
Fileクラスは不変(immutable)なクラスってことで
一度生成したら状態が決して変更されることがない設計ってわけか


Java6までの環境では必要に応じてcommons-ioなどのライブラリ
 http://commons.apache.org/io/
Java7からは
 http://d.hatena.ne.jp/nowokay/20110707

About arison

大都会岡山の南部にある玉野市生まれ。 大都会岡山のIT会社(目標は大都会No.1)でコンピュータとお客を相手に日夜格闘中。 関東出張中はグルメブログ。 基本的に遊び人のおっさん。 ライフハックとガンダム好き。ギガフロート玉野を浸透中。

18. 10月 2012 by arison
Categories: 日記, 仕事, プログラミング | Tags: | Leave a comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください