기본타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라
상수를 열거할 때는 문자열보다는 열거 타입이 월등히 낫다.
String compoundKey = className + "#" + i.next();
이때는 String이 제공하는 기능에만 의존해야 한다.
그래서 차라리 새로운 전용 클래스를 만드는 게 낫다.
이런 클래스는 보통 private 정적 멤버 클래스로 선언한다.
예) 스레드 지역 변수 기능 : 각 스레드가 자신만의 변수를 갖게 해주는 기능
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);
Key 클래스로 권한을 구분한 경우
이 경우 Key는 스레드 지역 변수를 구분하기 위한 키가 아니라, 그 자체가 스레드 지역변수가 된다.
public final class ThreadLocal {
public ThreadLocal();
public void set(Object value);
public Object get();
}
중첩 클래스 Key의 이름을 ThreadLocal로 변경하자.
하지만, 이 경우에는 get()으로 얻은 Object를 실제 타입으로 형변환해 써야 해서 타입 안전하지 않다.
```java
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}
}
매개변수화 타입을 사용하여 타입안전하게 만들자.
적합한 데이터 타입이 있거나 새로 작성할 수 있다면, 문자열을 쓰지 말자.
문자열은 같은 변수를 공유할 수 있기 때문에 권한을 표현하기에 적합하지 않다.