4. 不完全なコンパレータ
<基本データ型は値だけを持つが、ボクシングされた基本データ型の
インスタンスは値とは別のアイデンティティを持っている>
first < second では自動アンボクシングされ、うまくいく
first == second では Integer インスタンスの同一性比較を行
う
間違い!
Comparator<Integer> naturalOrder = new
Comparator<Integer>() {
public int compare(Integer first, Integer second) {
return first < second ? -1 : (first == second ? 0 : 1);
}
};
5. 不完全なコンパレータの修正案
Comparator<Integer> naturalOrder = new
Comparator<Integer>() {
public int compare(Integer first, Integer second) {
int f = first; // 自動アンボクシング
int s = second; // 自動アンボクシング
return f < s ? -1 : (f == s ? 0 : 1); // アンボクシングなし
}
};
6. Integer と int との比較
<基本データ型は完全に機能する値だけを持っているが、ボクシング
された基本データ型は null という機能しない値も持っている>
Unbelievable は表示……されません
かわりに、(i == 42) で NullPointerException がスローされます
単一操作内で基本データ型とボクシングされた基本データ型を混在させた場合に
は、ほとんどの場合にボクシングされた基本データ型は自動アンボクシングされ
る
この場合、i を Integer ではなく int で宣言すれば解決
public class Unbelievable {
static Integer i;
public static void main(String[] args) {
if (i == 42)
System.out.println("Unbelievable");
}
}
15. capability って?(1)
capability【名詞】
1【不可算名詞】 [具体的には 【可算名詞】]
a〔…の〕能力,才能,手腕,〔…すること〕のできること[能力,
才能] 〔for,in,of〕.
用例: evaluate the capability of a person 人の才能を評価する.
2【不可算名詞】
a(物のもつ)〔…する〕特性,性能 〔for〕.
用例
the capability of gases for compression ガスの圧縮する性質.
...
17. (capability の説明に用いられてい
る)ThreadLocal って?
個々のスレッドが固有の値を持つための変数
現在の Java では、以下のようなかたちでライ
ブラリとして提供されている
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}
18. capability として、
String の不適切な使用
public class ThreadLocal {
private ThreadLocal() {} // インスタンス化不可能
// 名前付き変数に対するカレントスレッドの値を設定する。
public static void set(String key, Object value);
// 名前付き変数に対するカレントスレッドの値を返す。
public static Object get(String key);
}
20. 本物の capability
public class ThreadLocal {
private ThreadLocal() {} // インスタンス化不可能
public static class Key { // capability
Key();
}
// 一意の偽造できないキーを生成する
public static Key getKey() {
return new Key();
}
public static void set(Key key, Object value);
public static Object get(Key key);
}
21. ThreadLocal に、もはや Key は不
要
set / get をインスタンスメソッドにする
ThreadLocal のインスタンス自体が capability
public class ThreadLocal {
public ThreadLocal();
public void set(Object value);
public Object get();
}
26. 文字列結合の不適切な使用
public String statement() {
String result = "";
for (int i = 0; i < numItems(); i++)
result += lineForItem(i); // String 結合
return result;
}
27. String の代わりに
StringBuilder を使用する
public String statement() {
StringBuilder b = new StringBuilder(numItems() *
LINE_WIDTH);
for (int i = 0; i < numItems(); i++)
b.append(lineForItem(i));
return b.toString();
}