Effective java 3版 読書会 3日目

実施日時:2018/12/5 22:00~23:00
対象範囲:項目11~項目14
参加者:こなやん、yodai、yoridori、まさや、やぎた、kassyi
形式:オンライン(discord)
   課題本を事前に読み、実業務と照らし合わせて記述内容の
   議論をする。

項目11 equalsをオーバーライドするとき、常にhashCodeをオーバーライドする
同じオブジェクトなら同じハッシュコードを返す必要が有る。
equalsで等しかったら同じハッシュコードを返す必要があるが、等しく無かったら同じでも異なっても良い。
プロジェクトでは、HashMapをtoStringして出力されたクラス名からクラスを生成していたものが有った。
生成したクラスをinstanceofで使用していた。

P53の下方にハッシュコード生成のやり方が記述されている。
31と言う乗数は、良い素数なのでその数を使おうとの事らしい。
丁度4バイト(0含めて32bit)なので、その意味もあるのか?

インスタンスが不変ならそのままキャッシュとして残し、呼び出された場合にハッシュコードの計算をするべきだが、そこまでパフォーマンスを求めるべきなのか疑問

オブジェクトクラスのハッシュメソッド(Objects.hash())を使用できるが、パフォーマンスがよろしく無い

equalsをオーバーライドする際はハッシュコードをオーバーライドする必要がある。
IDEでequalsのオーバーライドをした場合ハッシュコードの自動生成を行うが、生成の内容を注意する必要がある。

P56にハッシュコードの詳細を提供するなとの記述がある。
詳細な値や計算結果を提供した場合、別のところでそれが使われ、柔軟な変更が出来なくなる恐れがある。

項目12 toStringを常にオーバーライドする
デバックがし辛いバリューオブジェクトなどについて、インスタンスを表現するためtoStringを書いて分かり易くする。
デフォルトの@マーク付きの表示では分かり辛い。
P59 toStringで返される値には、プログラムによるアクセス手段を提供するべき。
enum型はそれと分かるので、toStringsは書かなくて良い。
インスタンス可能なクラスはtoStringsを書くべきまた、P58の様なドキュメントを記述する。
実際のプロジェクトでは、P58の一番下のような書き方を良くする。

項目13 cloneを注意してオーバーライドする
クラスにオブジェクト型が含まれていると、cloneのオーバーライドが必要となる。

cloneのオーバーライドせずにcloneすると、オブジェクト変数が含まれている場合にオブジェクトのインスタンスをコピーしてしまい、コピー先のインスタンスの値を変更すると、コピー元の値も変わる。

cloneのオーバーライドせずにcloneした場合は、シャロ―コピーになる。
cloneのオーバーライドではく、オブジェクトのコピーはコピーコンストラクタを使用する方がやり易い。
さもなくは、コピーファクトリを使用する。

配列についてはcloneを使った方が良い。
他はコピーコンストラクタかコピーファクトリを使う。
配列+オブジェクトなどの場合は、コピーコンストラクタの中でcloneを使ってコピーする。

P63要素がfinal定義されているとcloneが上手くいかない。
ドキュメントなどにcloneすることを明示する必要がある。

項目14 Comparableの実装を検討する
Compareを実装するときは、equalsと同じく契約を守って実装すること
業務において、型チェックをしてから実装したことがある。

P71基本データ型で順序比較をするときは、Double.compareやFloat.compareなどを使用する事、"<"や">"は使用しない事

実務ではComparableの実装をせず、for文を使用してソートする事が有った。

他社がSQLの構築をしている場合(SQLをいじれない場合)、Comparatorにて実装する必要があった。
また、ストリーム処理でマップを作った時に使用した。
基本的にSQLを使用する場合は、Order byでソートすれば良い。

P70キーが複数ある場合には、比較する順番に注意してソートする。
P73単純に引いた値をreturnする場合、大きい"+"と小さな"-"で計算するとオーバーフローすることがある。
P73の下、比較演算子("<"や">")を使うべきでない。
P72コンパレータ構築メソッドにおいて、Javaの型推論で判明可能なので、キー抽出子関数のパラメータ型を明示する必要は無い。
P71でconmpareToを使わない場合は、コンパレータ構築メソッドを使っている。

協力:Tech Baton
https://tech-baton.studio.design/



この記事が気に入ったらサポートをしてみませんか?