変数の不変・オブジェクトの不変

Imutable.java

public class Imutable {
    final public String str;
    public Imutable(String str){
        super();
        this.str = str;
    }
    public void main(String[] args){
        Imutable im = new Imutable("Object1");
        im = new Imutable("Object2");
    }
}

上のImutable.strは、それが指すオブジェクトが不変であるという意味で、不変な変数である。それに対し、main()内のImutable imに代入されたnew Imutable("Object1")は、そのオブジェクトが不変であるという意味で、不変なオブジェクトである。*1データなどのそれ自体が変化しては困るオブジェクトを不変オブジェクトとして保持することにより、意図せずに値を変更してしまうことに起因するバグを防止できる。
しばしば、関数型言語はバグの発生が少なく開発効率が高いと言われる。それらの利点は副作用の小ささに起因しているのだから、手続き型言語であっても不変オブジェクトの利用によって開発効率を高めることができる。*2

*1:不変オブジェクトの代表はjava.lang.Stringだろう。

*2:ところで関数型言語のリファレンスの少なさはどうにかならないのか?