String compoundKey = className + "#" + i.next();
문자열은 권한(capability)을 표현하기에 부족
// 문자열을 권한으로 사용하는, 잘못된 예제
public class ThreadLocal {
private ThreadLocal() { } // 객체를 만들 수 없다
// 주어진 이름이 가리키는 스레드 지역 변수와 값 설정.
public static void set(String key, Object value);
// 주어진 이름이 가리키는 스레드 지역 변수의 값 반환.
public static Object get(String key);
}
public class ThreadLocal {
private ThreadLocal() { } // 객체를 만들 수 없다
public static class Key { // (권한)
Key() { }
}
// 유일성이 보장되는, 위조 불가능 키를 생성
public static Key getKey() {
return new Key();
}
public static void set(Key key, Object value);
public static Object get(Key key);
}
public final class ThreadLocal {
public ThreadLocal();
public void set(Object value);
public Object get();
}
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}