final厨(=自分w)に関する考察

Introduction 〜 問題提起

Java魂―プログラミングを極める匠の技

Java魂―プログラミングを極める匠の技

以前、この本を読んだ。ザックリと要約してしまえば「finalは良いぞ。ミスを浮き彫りにしてくれる。ひたすらfinalじゃ。」という内容の本だった気がする。この影響で、自分はfinal厨*1になっていた。本の内容を鵜呑みに(しかも、意図を完全に納得せずw)して、とにかくfinalばっかりのコードを書いて来た。

しかしー。その辺のコードを色々読んでみるも、ここまでfinalを積極利用しているコードって、出会ったことがないのであります。そもそもJavaの「final」ってのは、どういう意図の時に使うモンなんだろうなぁ。こうやってfinalをしつこく使う事、って意味的にとか、読みやすさ的にとか、感覚的に、とか、みんなどうなんだろうなぁ。という問題提起。
ちなみに、これはclassとかmethodではなくて、変数に限った話です。そして、定数にfinalをつけるのは一般的、またローカル変数で無名リスナーからアクセスする時はfinalを付けざるを得ないので、以上の2つはこの場では議論の対象外。

Materials and Methods 〜 自分がfinal厨に至ったプロセス

まず、オブジェクト指向というものを勉強しているうちに、スコープは狭い方が良い、アクセス修飾子は出来る限り制限きつく、カプセル化、などの考え方をたたき込まれた訳です。色んな本に。ならば、finalで制限を締めあげておくのも、同様の考え方で「良きこと」であろうと考えました。

ただ、意味的にキモイ記述であってはならない。例えば、finalはconstと同義で、「定数」を表すものと仮定すると、「定数じゃないけど、変化しない前提の変数」にfinalがついているのはキモイ。定数じゃないのだから。ところでJavaでは、機能していないけどconstが予約語になってます。だから、finalとconstは別物である、という認識をし、まぁ「キモイ」って事はないであろうと考えました。

Results 〜 final厨となった結果

良かったこと
  • 上記書籍で指摘されている、ミスを浮き彫りにする効果。
    • ただ、実際に「finalがあってよかった〜」と実感したことは無いのが微妙w
  • 「ここで変数定義してますよー」的な「目印」として見やすくなった。
    • これは一般的感覚ではなく、あくまで個人的感覚。
    • 「変な癖がついてしまった」とも言える。
悪かったこと
  • そもそもfinal厨を見たことがないマイノリティー的不安感w
  • 慣れていない人がみれば、読みにくいコードになってしまうかも、という不安感。
  • constとの違いの件で納得はしたけれど、本当にその解釈は正しいのか、という不安感。
  • 無闇にfinalを使いすぎると、finalを見た時の「警告感*2」が薄れる。

Discussion 〜 Java-jaに問題提起をして議論

  • 外部公開したときにその変数(つまり内部構造)を変えられなくなるから、自由度を締め上げ過ぎるのは良くない。
  • インスタンス変数は、継承した時に制限があって死ぬことがある。つまり、ハックできない。
  • 誰がどんな使い方をするのか、ということは作った段階では予想できない。
  • そんな段階で、いい変更の可能性を摘み取ってはいけない。
  • 自分だけで使ってる分には「必要になったら緩めればいい」って事になるけど、公開したときに問題が起こりうる。
  • これはfinalに限らず、アクセス修飾子を締め上げすぎる事についても同様のことが言える。

Conclusions 〜 自分が一番納得できた結論

ローカル変数はメソッド内に閉じているからfinalにしてもいいのだけど、インスタンス変数には付けるべきではない。

Acknowledgement 〜 謝辞

議論に付き合ってくれたJava-jaのみんな、ありがとう>< 特に理論的な結論を導いてくれたid:t_yanoさん。

*1:finalで大丈夫な変数には無差別でfinalをつける。

*2:finalである理由を意識する感覚