変数はすべてfinal

Javaプログラミングで非情のルールを考えたことがある(自分も含めて誰も実践してくれなかったのだが)。それは、「オブジェクト型の変数にすべてfinalを付ける」というもの。このルールに従うと、

  • すべてのメンバ変数が、コンストラクタで必ず初期化され、値が変わらないことが保障される
  • 一つのローカル変数が複数の意味で使われることが防止される

という、良いプログラムの決まり事に沿うことができる。さらに、決定的な効果として、Javaの実行時エラーの95%を占める「NullPointer Exception」がなくなる。というのも、nullになり得る変数が存在しないのだから。

C++では、クラスの代入オペレータを禁止する(private宣言する)ことで、上と同じような「値が変わらない変数」を作ることができる。代入オペレータ禁止クラスのオブジェクトは、コンストラクタ、コピーコンストラクタでしか値がセットされず、そしてそれを変更できない。

今日、自分のC++プログラムの中で、Objectというクラスを作って、代入オペレータ禁止の基底クラスを作った。自分で作ったクラスは必ずこれを継承することにして、「すべての変数は不変」というプログラムにチャレンジしたい。(C++の場合は、いざとなったらポインタで逃げれるのだが。)