インスタンスは不変
日本語 | 実体不変 |
英語 | instances are immutable |
ふりがな | いんすたんすはふへん |
フリガナ | インスタンスハフヘン |
インスタンスの作成後は、インスタンス内のフィールドを変更できないこと。
つまり、そのインスタンスは定数ということになる。
Integerクラス等のラッパークラスや、Stringクラス、BigDecimalクラス、Fileクラスといったクラスのインスタンスが該当する。つまりこれらのクラスの「インスタンスは不変」である。
たとえばIntegerクラスの場合、インスタンスを作成した後は、インスタンス内の整数値を変更することはできない。整数値を格納するフィールドがprivateフィールドであり、フィールドを書き換えるメソッドが提供されていないからである。
そのため、Integerクラスのインスタンスは定数となる。これが「インスタンスは不変」という意味である。
これは他のラッパークラスや、Stringクラス、BigDecimalクラス、Fileクラスでも同様である。たとえばStringクラスであれば、インスタンスを作成後に、格納されている文字列を書き換えることはできない。
ただし、変更できないのはあくまで「インスタンス内の値」である。
参照変数が指すインスタンスを「取り替える」ことは可能なため、変更したければ新たにインスタンスを作成し参照を切り替えればよい。
また、Stringクラスに対してはStringBufferクラスという、インスタンス内の文字列を書き換えられるクラスが用意されている。
つまり、そのインスタンスは定数ということになる。
Integerクラス等のラッパークラスや、Stringクラス、BigDecimalクラス、Fileクラスといったクラスのインスタンスが該当する。つまりこれらのクラスの「インスタンスは不変」である。
たとえばIntegerクラスの場合、インスタンスを作成した後は、インスタンス内の整数値を変更することはできない。整数値を格納するフィールドがprivateフィールドであり、フィールドを書き換えるメソッドが提供されていないからである。
そのため、Integerクラスのインスタンスは定数となる。これが「インスタンスは不変」という意味である。
これは他のラッパークラスや、Stringクラス、BigDecimalクラス、Fileクラスでも同様である。たとえばStringクラスであれば、インスタンスを作成後に、格納されている文字列を書き換えることはできない。
ただし、変更できないのはあくまで「インスタンス内の値」である。
参照変数が指すインスタンスを「取り替える」ことは可能なため、変更したければ新たにインスタンスを作成し参照を切り替えればよい。
また、Stringクラスに対してはStringBufferクラスという、インスタンス内の文字列を書き換えられるクラスが用意されている。
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// Integerクラスのインスタンスは不変です。
Integer i = new Integer( 100 );
System.out.println( i );
// 100
// 今作られたインスタンス内には100が格納されて
// いますが、この値を200に書き換えることは
// できません。
// 格納しているフィールドにアクセスできませんし、
// 書き換えるメソッドもありません。
// ただし、インスタンスを新たに作って、参照を
// 上書きしてしまえば、実質的に「変更」できます。
i = new Integer( 200 );
System.out.println( i );
// 200
// 新たにインスタンスを作って200を格納し、それを
// 参照させました。
// 最初に作ったインスタンスは、まだ100を格納した
// ままですが、参照型変数iを通して見た場合には、
// 実質的に「200に変更できた」ことになります。
}
}
public class Sample
{
public static void main( String[] args )
{
// Integerクラスのインスタンスは不変です。
Integer i = new Integer( 100 );
System.out.println( i );
// 100
// 今作られたインスタンス内には100が格納されて
// いますが、この値を200に書き換えることは
// できません。
// 格納しているフィールドにアクセスできませんし、
// 書き換えるメソッドもありません。
// ただし、インスタンスを新たに作って、参照を
// 上書きしてしまえば、実質的に「変更」できます。
i = new Integer( 200 );
System.out.println( i );
// 200
// 新たにインスタンスを作って200を格納し、それを
// 参照させました。
// 最初に作ったインスタンスは、まだ100を格納した
// ままですが、参照型変数iを通して見た場合には、
// 実質的に「200に変更できた」ことになります。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // Integerクラスのインスタンスは不変です。 Integer i = new Integer( 100 ); System.out.println( i ); // 100 // 今作られたインスタンス内には100が格納されて // いますが、この値を200に書き換えることは // できません。 // 格納しているフィールドにアクセスできませんし、 // 書き換えるメソッドもありません。 // ただし、インスタンスを新たに作って、参照を // 上書きしてしまえば、実質的に「変更」できます。 i = new Integer( 200 ); System.out.println( i ); // 200 // 新たにインスタンスを作って200を格納し、それを // 参照させました。 // 最初に作ったインスタンスは、まだ100を格納した // ままですが、参照型変数iを通して見た場合には、 // 実質的に「200に変更できた」ことになります。 } }