Effective java 3版 読書会 4日目

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

項目15 クラスとメンバーへのアクセス可能性を最小限にする
publicやprotectedにすると互換性を維持するために、使う人のサポートをする必要がある。
パッケージプライベートはデフォルトと言われることも有る。
Java9からパッケージをグループ化するモジュールが導入された。
public static finalの配列やIDEで自動作成されたアクセッサ―メソッドは、
そのまま使用しない様にする。
使用する場合は、P78の上の記述を参照に記述を修正する。

項目16 publicのクラスでは、publicのフィールドではなく、アクセッサ―メソッドを使う
publicクラスは、可変なフィールドを公開するべきでない。
パッケージプライベートは、パッケージ内でしか値のやりとりしない
privateのネストしたクラスの場合、そのフィールドを公開する事は問題ない

項目17 可変性を最小限にする
不変クラスの欠点として、状態の僅かな変更に対して2つのオブジェクトを
作成する必要が有る。
例えば、100万ビットの内1ビットを変更したい場合は、100万ビットの
オブジェクトを2つ作成する必要が有る。
まず、設計する時に不変クラスを考えて、ダメなら可変クラスを使うようにする。
不変クラスでは、コンストラクタの代わりにstaticファクトリメソッドを作成すると良い。
BigIntegerやBigDecimalを使うときは、対象の値が可変の可能性が有るので、不変なことに依存する場合、防御的コピーを使用するべき。
プロジェクトでは、お金を扱う時以外ではBigIntegerやBigDecimalはあまり使われない。
⇒https://javazuki.com/articles/bigdecimal-why.html
勘定系ではfloat,doubleは使わない方が良い、丸めを考えるとBigIntegerやBigDecimalを使用するべき。
アクセッサ―メソッドのsetメソッドを考え無しで作るべきでない、良く考えて作成する。

項目18 継承よりもコンポジションを選ぶ
P89の下、HashSetを継承してaddAllをオーバーライドしているが、addallがaddを使用しているので、計算結果が正しい値の2倍になっている。
addallがaddを使用していることを意識しないで済む方法が良い。
実装継承した具象クラスをうかつに継承すると、あるメソッドが他のメソッドを使用している場合があるため、意図せぬ動きや不整合が起きる可能性があるので注意する。
しかし、基本的には具象クラスをそのまま継承する事は無い。
setインターフェースを使っている理由は、Hashsetと共通で同じメソッドを使いたいため。
P91の下の例は、デコレ―タパターンを使用している。
また、継承を使うアダプターパターンに似ている。
アダプターパターンの例に当てはめると
 Forwardingsetがアダプター
 InstrumentedSetがアダプティ―
 setがターゲット
デコレータパターンの例に当てはめると
 concreteComponentが HashSet
 decoratorがForwardingset
 concreteDecoratorがInstrumentedSet

fileI/Oで使うようなbuffered io streamはデコレータパターンとなっている。
例として以下の処理を挙げる。
 FileInputStream fis = new FileInputStream(filePath);
 BufferedInputStream bis = new BufferedInputStream(fis);
FileInputStreamはファイルの内容を逐次入力するが、それに対して
BufferedInputStreamがバッファリングの機能を拡張(デコレーション)している。

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

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