SlideShare a Scribd company logo
1 of 27
Effective Java輪読会 vol.0
第2章 項目1,2
李 充根
今日の流れ
• 19:30-19:45 自己紹介
• 19:45-19:55 勉強会説明
• 19:55-20:20 輪読会の進め方検討
• 20:30-21:15 輪読発表・議論
• 21:15-21:30 次回日程・発表者検討
• 第0回なので今後の進め方を一緒に考えましょう
2014/4/4 EffectiveJava輪読会 2
自己紹介
• 名前・HN
• 仕事・研究
• 趣味
• 好きなエディタ
• 好きなemacs lisp
• Etc…
2014/4/4 EffectiveJava輪読会 3
自己紹介
• 名前:李充根(リ・チュングン)
• HN:りぐん
• twitter:@choonggeun @ligunligun
• FB:choonggeun
• 言語:C/C++、C#、Java
• 趣味:プリキュア実況、アイカツ
• 西プロ主催
2014/4/4 EffectiveJava輪読会 4
勉強会説明
• そもそものきっかけ
– twitter
– https://twitter.com/choonggeun/status/444791870179123200
• 本買ったのはいいけどボリューム多いし一人で勉強するのだるい!
• Effective Javaは訳が良くなくて固いことで有名
• みんなで勉強すれば負担は減るかな
• まぁそんな感じです
• 対象・前提知識
– Java7くらいまでの基礎
– GoFデザインパターン
• 参考
– http://www.techscore.com/
2014/4/4 EffectiveJava輪読会 5
進め方
• 一回につき2人位発表?
• 一回につき一章くらいのペースかな
(11章あるので月一で大体一年くらい)
• (発表(20分)+議論(20分))*2かな?
• 全発表後、次回の発表者を決める
• その他何か意見があれば
2014/4/4 EffectiveJava輪読会 6
発表
• 第2章 オブジェクトの生成と消滅
– 項目1 staticファクトリーメソッド
– 項目2 ビルダーパターン
2014/4/4 EffectiveJava輪読会 7
コンストラクタの代わりに
staticファクトリーメソッドを検討する
項目1
2014/4/4 EffectiveJava輪読会 8
項目1 staticファクトリーメソッド
• 通常のインスタンス生成
• Staticファクトリーメソッド(not GoFのファクトリーメソッ
ド)
2014/4/4 EffectiveJava輪読会 9
Class Hoge{
public Hoge(){
//何か処理
}
}
public static Boolean valueOf(boolean b){
return b ? Boolean.TRUE : Boolean.False
}
メリット1 名前を持つ
• コンストラクタのパラメータだけではオブジェ
クトを表せない時でも適切な名称を与えること
ができる
• 例(確率的素数を返す)
2014/4/4 EffectiveJava輪読会 10
BigInteger(int, int, random)
BigInteger.probablePrime(int, random) ※Java 1.4で追加
Hoge(String, int)
Hoge(int, String)
メリット2 新しいオブジェクト生成が必要ない
• 予め用意しておいたインスタンスを使用、すでに生
成したインスタンスをキャッシュすることによりイ
ンスタンス生成を低減
• インスタンス生成のコストが高い時に有効
• GoFのFlyweightパターンに類似
• 例
– Boolean.valueOf(boolean b)
– シングルトンのgetInstance()
• インスタンス制御されている
• シングルトン(項目3)、インスタンス化不可能(項目4)
2014/4/4 EffectiveJava輪読会 11
メリット3 戻り値を任意のサブタイプで返すことができ
る
• 返すオブジェクトをpublicにすることなくインス
タンスを生成できる
• インターフェイスに基づくフレームワーク(項目18)に向く
• 概念的重みが軽くなる
• 例
– EnumSet
– RegularEnumSet, JumboEnumSet
2014/4/4 EffectiveJava輪読会 12
メリット4 インスタンス生成の面倒さの低減
• 通常だと
• staticファクトリーメソッドを用いて
というメソッドが定義されていると
と簡略化できる
2014/4/4 EffectiveJava輪読会 13
Map<String, List<String>> m = new HashMap<String, List<String>>();
※Java6以前
pubic static <K, V> HashMap<K, V> newInstance(){
return HashMap<K, V>();
}
Map<String, List<String>> m = HashMap.newInstance();
※Java7以降ではダイアモンド演算子で次のように書ける
Map<String, List<String>> m = new HashMap<>();
デメリット1 サブクラスを作れない
• 問題点
– privateコンストラクタのみのクラスではサブクラス
を作れない
• 例
– コレクションフレームワークの各実装?
• 解決策
– 継承ではなくコンポジションの使用(項目16)
2014/4/4 EffectiveJava輪読会 14
デメリット2 他のstaticメソッドと区別がつかない
• 問題点
– コンストラクタのように目立たない
– staticファクトリーメソッドかどうか知ることが困難
• 解決策
– 命名規則に従う
• 例
– valueOf
– of
– getInstance
– newInstance
– getType
– newType
2014/4/4 EffectiveJava輪読会 15
数多くのコンストラクタパラメータに
直面した時にはビルダーを検討
項目2
2014/4/4 EffectiveJava輪読会 16
項目2 ビルダーパターン
• テレスコーピングコンストラクタ
2014/4/4 EffectiveJava輪読会 17
public class 栄養成分{
private final int 分量; //必須
private final int 総容量; //必須
private final int カロリー; //オプション
private final int 脂肪; //オプション
private final int 炭水化物; //オプション
private final int タンパク質; //オプション
public 栄養成分(int 分量, int 総容量, int カロリー, int 脂肪,
int 炭水化物, int タンパク質){
this.分量 = 分量;
this.総容量 = 総容量;
this.カロリー = カロリー;
this.脂肪 = 脂肪;
this.炭水化物 = 炭水化物;
this.タンパク質 = タンパク質;
}
}
テレスコーピングコンストラクタ
• 次のように各オプションを定義
2014/4/4 EffectiveJava輪読会 18
public 栄養成分(int 分量, int 総容量){
this(分量, 総容量, 0, 0, 0, 0);
}
public 栄養成分(int 分量, int 総容量, カロリー){
this(分量, 総容量, カロリー, 0, 0, 0);
}
public 栄養成分(int 分量, int 総容量, カロリー, 脂肪){
this(分量, 総容量, カロリー, 脂肪, 0, 0);
}
public 栄養成分(int 分量, int 総容量, カロリー, 脂肪, 炭水化物){
this(分量, 総容量, カロリー, 脂肪, 炭水化物, 0);
}
テレスコーピングコンストラクタ
• 使い方
• 問題点
– 書きにくい
– 読みにくい
– 多数のパラメータの時煩雑になる
– パラメータの順番などバグの温床となる
2014/4/4 EffectiveJava輪読会 19
栄養成分 コーラ = new 栄養成分(240, 8, 100, 0, 35, 27);
JavaBeansパターン
• 不整合を許す
2014/4/4 EffectiveJava輪読会 20
public class 栄養成分{
private int 分量 = -1; //必須
private int 総容量 = -1; //必須
private int カロリー = 0; //オプション
private int 脂肪 = 0; //オプション
private int 炭水化物 = 0; //オプション
private int タンパク質 = 0; //オプション
public 栄養成分(){ }
public void set分量(int val){ this.分量 = val; }
public void set総容量(int val){ this.総容量 = val; }
public void setカロリー(int val){ this.カロリー = val; }
public void set脂肪(int val){ this.脂肪 = val; }
public void set炭水化物(int val){ this.炭水化物 = val; }
public void setタンパク質(int val){ this.タンパク質 = val; }
}
※JavaBeans
再利用性の向上のため
1. 引数なしコンストラクタ
2. setter/getter
が定義された単純なクラス
JavaBeansパターン
• 使い方
• 問題点
– 不整合な状態になる
– クラスを不変にする可能性を排除(項目15)
– スレッドセーフにするために労力がかかる
2014/4/4 EffectiveJava輪読会 21
栄養成分 コーラ = new 栄養成分();
コーラ.set分量(240);
コーラ.set総容量(8);
コーラ.setカロリー(100);
コーラ.炭水化物(35);
コーラ.タンパク質(27);
ビルダーパターン
• 栄養成分クラス
2014/4/4 EffectiveJava輪読会 22
public class 栄養成分{
private final int 分量; //必須
private final int 総容量; //必須
private final int カロリー; //オプション
private final int 脂肪; //オプション
private final int 炭水化物; //オプション
private final int タンパク質; //オプション
public static class Builder{
……
}
private 栄養成分(Builder builder){
分量 = builder.分量;
総容量 = builder.総容量;
カロリー = builder.カロリー;
脂肪 = builder.脂肪;
炭水化物 = builder.炭水化物;
タンパク質 = builder.タンパク質;
}
}
ビルダーパターン
• ビルダークラスの詳細
2014/4/4 EffectiveJava輪読会 23
public static class Builder{
private final int 分量;
private final int 総容量;
private int カロリー = 0;
private int 脂肪 = 0;
private int 炭水化物 = 0;
private int タンパク質 = 0;
public Builder(int 分量, int 総容量){
this.分量 = 分量;
this.総容量 = 総容量;
}
//続く→
ビルダーパターン
• ビルダークラスの詳細
2014/4/4 EffectiveJava輪読会 24
//←続き
public Builder カロリー(int val){ カロリー = val; return this; }
public Builder 脂肪(int val){ 脂肪 = val; return this; }
public Builder 炭水化物(int val){ 炭水化物 = val; return this; }
public Builder タンパク質(int val){ タンパク質 = val; return this; }
public 栄養成分 build(Builder builder){
分量 = builder.分量;
総容量 = builder.総容量;
カロリー = builder.カロリー;
脂肪 = builder.脂肪;
炭水化物 = builder.炭水化物;
タンパク質 = builder.タンパク質;
}
}
ビルダーパターン
• 使い方
• 利点
– 読みやすい
– 書きやすい
• 欠点
– テレスコーピングコンストラクタより冗長
– パフォーマンスに影響がある(場合がある)
2014/4/4 EffectiveJava輪読会 25
栄養成分 コーラ = new 栄養成分.Builder(240, 8).カロリー(100).
炭水化物(35).タンパク質(27).build();
まとめ
• 同一のパラメータ数で別々のオブジェクトを生
成したり、コンストラクタだけでは適切な名称
ではないときstaticファクトリーメソッドを検討
する
• 可変の多数のパラメータで初期化したい時ビル
ダーパターンをしようする
2014/4/4 EffectiveJava輪読会 26
次回日程・発表者
• 希望日時
• 発表者選出
• 項目分け
2014/4/4 EffectiveJava輪読会 27

More Related Content

More from Lee Choong Geun

TeslaCryptを焼き肉に変えた話
TeslaCryptを焼き肉に変えた話TeslaCryptを焼き肉に変えた話
TeslaCryptを焼き肉に変えた話Lee Choong Geun
 
もっと気軽に勉強会を
もっと気軽に勉強会をもっと気軽に勉強会を
もっと気軽に勉強会をLee Choong Geun
 
PBLのためのはじめてのGit
PBLのためのはじめてのGitPBLのためのはじめてのGit
PBLのためのはじめてのGitLee Choong Geun
 
出、出~!勉強会参加技術向上思奴wwww
出、出~!勉強会参加技術向上思奴wwww出、出~!勉強会参加技術向上思奴wwww
出、出~!勉強会参加技術向上思奴wwwwLee Choong Geun
 
xamarin for android試してみた
xamarin for android試してみたxamarin for android試してみた
xamarin for android試してみたLee Choong Geun
 
西区プログラム勉強会説明資料OSC発表版
西区プログラム勉強会説明資料OSC発表版西区プログラム勉強会説明資料OSC発表版
西区プログラム勉強会説明資料OSC発表版Lee Choong Geun
 
ハードウェアで遊ぼうよ
ハードウェアで遊ぼうよハードウェアで遊ぼうよ
ハードウェアで遊ぼうよLee Choong Geun
 
西区プログラム勉強会(仮)Ver2
西区プログラム勉強会(仮)Ver2西区プログラム勉強会(仮)Ver2
西区プログラム勉強会(仮)Ver2Lee Choong Geun
 

More from Lee Choong Geun (9)

TeslaCryptを焼き肉に変えた話
TeslaCryptを焼き肉に変えた話TeslaCryptを焼き肉に変えた話
TeslaCryptを焼き肉に変えた話
 
もっと気軽に勉強会を
もっと気軽に勉強会をもっと気軽に勉強会を
もっと気軽に勉強会を
 
PBLのためのはじめてのGit
PBLのためのはじめてのGitPBLのためのはじめてのGit
PBLのためのはじめてのGit
 
出、出~!勉強会参加技術向上思奴wwww
出、出~!勉強会参加技術向上思奴wwww出、出~!勉強会参加技術向上思奴wwww
出、出~!勉強会参加技術向上思奴wwww
 
LINQ雑談
LINQ雑談LINQ雑談
LINQ雑談
 
xamarin for android試してみた
xamarin for android試してみたxamarin for android試してみた
xamarin for android試してみた
 
西区プログラム勉強会説明資料OSC発表版
西区プログラム勉強会説明資料OSC発表版西区プログラム勉強会説明資料OSC発表版
西区プログラム勉強会説明資料OSC発表版
 
ハードウェアで遊ぼうよ
ハードウェアで遊ぼうよハードウェアで遊ぼうよ
ハードウェアで遊ぼうよ
 
西区プログラム勉強会(仮)Ver2
西区プログラム勉強会(仮)Ver2西区プログラム勉強会(仮)Ver2
西区プログラム勉強会(仮)Ver2
 

Recently uploaded

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (12)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Effective Java輪読会 vol0