or1ko's diary

日々を書きます

メソッドの引数にfinalは必要なのか

以前、CheckStyleにこった時に、やたらメソッドの引数にfinalをつけるようにしたことがある。そのときは、finalにコンパイル的な効力はないことは知っていたけれど、メソッドの利用者に副作用がないメソッドですよと思わせられるのではと、きっちりfinalをつけていた記憶がある。

ただ、そのうち、つけなくなった。今でも、つけてない。その理由は、以下の二点。

  • 基本的に引数の中身を変更したり、変数を再利用するメソッドを作らない。ので、finalだらけになる。冗長なので、finalを基本的につけなくして、引数を変更する場合にメソッドのJavadocに注意書きを書くようにしたほうが良い。final修飾子よりも、むしろ、inmutable的な修飾子がほしい
  • finalを使うコードの目的が明確にならない。finalは直感的な効果が得られないので、finalに対して、特別な意味(たとえば、引数を変更させるような処理を入れてないとか)を持たせているか、またはfinalの意味を勘違いしている可能性を考えてしまう。が、その答えはわからないので、引数に与える変数は、やっぱりCloneを与えて、副作用を受けないように配慮する