2012年6月27日水曜日

staticとfinal

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

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

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

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

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

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

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

2012年6月13日水曜日

gitで作業ツリーの内容を別ブランチへ移す

masterブランチで機能追加をしていて、途中で実装方法のミスに気付いたり、より良い実装方法を思いついて、現在の作業ツリーの内容を破棄したくなることがある。

このとき万が一のことを考えて、現在の作業内容をmasterにコミットしたくないものの、別ブランチなどに保存しておきたい場合、stashが使える。

git stash save "任意の名前"

で現在の作業ツリーの内容を一時領域に保存する。保存すると同時に作業ツリーはHEADの状態になる。

その後、別ブランチを切って、一時領域の内容を取り出す。

git checkout -b anotherbranch
git stash pop

popを使うと、最新の一時領域の内容を現在のワークツリーに呼び出した後、一時領域が削除されるので手間がない。あとはこの内容を別ブランチにコミットして、masterでより優れた実装方法を試してみる。うまくいかなければこのブランチに戻る。

他により良いやり方はあるかもしれない。