2012年6月27日水曜日

staticとfinal

Javaにおける修飾子、finalとstatic。

final staticを定数として使うイディオムは分かりやすいものの、それ以外でどういう場面で使えばいいのかいまいち見えなかった。static変数はまだ分かるけど、staticメソッド、finalフィールドの使いどころはさっぱり見極められなかった。

コードの整理を考えていて、わりと良さげな基準が閃いた。

  • finalとは「再代入を許可しない」、つまりそのデータを上書きする必要がないフィールドや引数であることを明示する文書化である。
  • staticとは「インスタンスと紐付かない」、インスタンスの振る舞いに対して冪等なメソッドであることを明示する文書化である。

つまるところ、使いにくいのはstaticやfinalを指定することでどういうメリットがあるのか見えにくいという部分にあるんじゃないだろうか。

finalを使わなくてもコードを書いている自分が間違えて再代入することはありえないし、staticを使ってインスタンスメソッドをクラスメソッドにすることによるパフォーマンスの違いも、VMの最適化が進んだ今なら致命的じゃないから徹底するほどだとも思えない。(そうじゃないかもしれませんが…)

そこで、修飾子とはコードとして最適化することを主眼にするのではなく、「コードを読む/使う人間がそのメソッドやフィールドの機能をより明確に/正しく掴むための文書化である」と考え方を変えてみようと思う。

0 件のコメント:

コメントを投稿