読者です 読者をやめる 読者になる 読者になる

雨谷の日和

過去12年で1,600を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

分数での掃き出し法による行列式計算6

前回の記事について、esper 氏から補足を頂いたので整理しておきます。
以下の部分についてですね。

ところで上記の計算は全てtemp に対して行い、元々のFraction インスタンスの値は編集しません。
以後、処理を実装する際にはすべてそういう方針で行います。一度コンストラクタで設定されたprivate な変数の値は、一切変更しないことで、色々と便利に使える場面が出てくるというのがその理由です。(こういう実装ポリシーを何と呼ぶのかは知りませんが、私はこのアプローチが好きです)

イミュータブル、でしたっけ?僕も好きです。

ということで、上記の実装ポリシーについては以後イミュータブルという呼び方をすることにしますです。esper 氏には感謝。
イミュータブルについては、浅海氏とかが既に良い解説を書いていたりしますね。詳細な説明についてはそういったサイトをご覧頂ければ良いかと思います。
イミュータブル


さて、同じコメント内で「個人的にはnumeratorとdenominatorにもfinal付けたいなー」とも書いて頂いているので、ちょっとfinal を付けてみようかと思います。
ソースコード

  private final long numerator;
  private final long denominator;

ところがですね、こうしてしまうと前回追加した掛け算の関数の部分、temp 変数のnumerator やdenominator を変更する箇所でコンパイルエラーになってしまいますね。
うーむ。
temp としてFraction のインスタンスを用いるのではなく、long の変数を二つ用意して、return するときに生成してやれば上記のコンパイルエラーは出なくなりますが、そういう実装のメリットってどれくらい大きいのでしょう。ソースコードはちょっと読み難くなるような気がしますね。
実効的な違いが無ければ、non-static なprivate 変数にfinal を付ける必要はあまり無いのかも知れません。
個人的には、public やprotected な変数にfinal を付けることは良くやるんですが、non-static なprivate 変数には付けたことが無いような気もします。まあ、public な変数ってstatic final 以外ほとんど使わないですけど。protected は状況次第、かなあ?パッケージビューは中途半端過ぎて最近すっかり使わないですね。


以上、簡単に補足でした。