More Related Content More from Appresso Engineering Team More from Appresso Engineering Team (20) Effective java 輪読会 第2章 項目5,6,73. 不変(immutable)オブジェク
ト
• 例1 : Stringクラス
{
String s1 = new String("stringette"); // この行の実行時にオ
ブジェクトが生成される
...
{
String s2 = new String("stringette"); // この行でも!
}
4. 不変(immutable)オブジェク
ト
• 例1 : Stringクラスについては、こう書けば
よい
{
String s = "stringette“; // 同一仮想マシンで動作し、同じ文
字列リテラルを持っている他のコードでも同じオブジェクト
を再利用する
}
5. 不変(immutable)オブジェク
ト
• 例2 : Booleanクラス
{
String booleanString = “true”;
Boolean b = Boolean(booleanString); // この行の実行時にオ
ブジェクトが生成される
}
6. 不変(immutable)オブジェク
ト
• 例2 : Booleanクラスについては、こう書けばよい
{
String booleanString = “true”;
Boolean b = Boolean.valueOf(booleanString); //新たなオブ
ジェクトを生成しない
}
7. 可変(mutable)オブジェクト
• 例 : pp.21 isBabyBoomer()メソッド
– boomStartとboomEndは何度呼ばれても変化すること
がない!にもかかわらず、呼ばれるたびに
• Calendar
• TimeZone
• Date * 2
のインスタンスを生成してしまう。
9. 可変(mutable)オブジェクト
• 注意 : 遅延初期化について
– でもisBabyBoomer()が呼ばれなかった時、
BOOM_STARTとBOOM_ENDの初期化が無駄になるので、
遅延初期化を行うのがベストなのでは……?
→実装が複雑になり、パフォーマンスにも大した改
善が見られないことが多いので、おすすめしない。
★パフォーマンス改善の第一原則 : 測れ
★時期尚早な最適化は諸悪の根源
10. Adapterパターン
• 例 : Map#KeySet
– Map#KeySet()はMapのキーの集合のビューを返すにす
ぎない。
– 何度呼ばれても、その都度インスタンスを生成しな
い。(同じインスタンスを返す)
– 疑問 : 「Adapterパターン」と書いた(書いてある)
が、「Map」は「Set」への「Adapter」なのか?とい
う点については、疑問。「Set」が「ビュー」という
ことなら納得できるが……。
→KeySetがSetへのアダプター
11. オートボクシング
• 例 : Long
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += 1; // ここでオートボクシングが行われる!
}
System.out.println(sum);
}
※Joshua Blockのマシン(スペック不明)では、43.2秒もか
かる!
(Longを使用しなければ、6.8秒)
16. メモリリーク
• 例 : pp.24のStackクラス
– ここでリークする: return elements[--size];
– デクリメントする前の「size - 1」の要素には外部から
アクセスする手段がなくなるが、配列elementsはその
要素オブジェクトへの参照を保持している<廃れた
参照>
– 廃れた参照が参照しているオブジェクト……が参照し
ているオブジェクト……と言った具合に、多量のオブ
ジェクトがリークするおそれもある
17. メモリリーク
• 例 : pp.24のStackクラスへの解決策
– elements[size] = null; // 廃れた参照を取り除く
– もし間違ってその要素を参照した場合に、
NullPointerExeptionが発生することによって問題が早
期にわかるというメリットもある
– 注意:普通は、ローカル変数の適切な定義によって
参照が自然にスコープからはずれるようにすべき