Effective Java(項目6〜7)

はぁー、全然進まナス。つーか項目7とか長過ぎだし。本読んでる途中でEclipse立ち上げちゃダメだって。進まないって。
○項目6 ファイナライザを避ける

・ファイナライザの使用は出来る限り避けるべき
→不安定な振る舞い、低いパフォーマンス、移植性の問題がある。有効な場合もあるが、大抵の場合は必要ない。

・即座にファイナライザが実行される保証はない
→時間的に制約のあることをファイナライザで行うべきではない ex)openに対するclose処理など

・さらに言えばファイナライザは最終的に実行される保証すらない
→System.gcやSystem.runFinalizationは実行される可能性を上げるだけに過ぎない

・ファイナライザ使うぐらいなら、try-finally構文を使用してfinally節内に明示的な終了メソッドを書こう
→close処理やdispose処理をfinally節に(これは基本だと思う)

※つーか最初ファイナライザってなんだよって思った。聞いたことないし。


○項目7 equalsをオーバーライドする時は一般契約に従う

・Objectクラスのfinalでないメソッド(equals,hashCode等)はオーバーライドされるように設計されている
→一般契約(general contract)があり、それに従わないと適切に機能しなくなる

・オーバーライドせず、そのまま使うのが適切な場合もそれなりにある
- クラスの個々のインスタンスは本質的に一意である場合
- 「論理的等価性」について知る必要がない場合
- クラスがprivateであり、そのequalsメソッドが決して呼び出されない場合 などなど

・一般契約(general contract)とは同値関係(equivalence relation)のこと
- 反射的:x.equals(x)はtrueを返すこと
- 対称的:x.equals(y)がtrueを返すならy.equals(x)もtrueを返すこと
- 推移的:x.equals(y),y.equals(z)ともにtrueを返すならばx.equals(z)もtrueを返すこと
- 整合的:x,yについてequalsの比較に用いられる情報が修正されない限りx.equals(y)は同じ値を返すこと
- x.equals(null)はfalseを返すこと
(但し、x,y,zはnullでない)

・多くのクラスが、それらに渡されたオブジェクトがequals契約にしたがっていることに依存している
→equals契約を破ってしまうと、そのオブジェクトに対する他のオブジェクトの振る舞いが保証されない

・equalsメソッドをオーバーライドする際の手順
→長いので省略