아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
문자열은 다른 값 타입을 대신하기에 적합하지 않다.
기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라
문자열은 열거 타입을 대신하기에 적합하지 않다.
문자열은 혼합 타입을 대신하기에 적합하지 않다.
여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.
String compoundKey = className + "#" + i .next ();
단점
구분 문자 '#'이 두 요소 중 하나에서 쓰이면 혼란
각 요소를 개별로 접근하려면 문자열 파싱해야되서 느리고, 오류가능성
적절한 equals, toString, compareTo 메서드 제공 못함
각 스레드가 자신만의 변수를 갖게 해주는 기능
// 잘못된 예
public class ThreadLocal {
private ThreadLocal () { }
public static void set (String key , Object value ); // 한 스레드의 값을 키로 구분해 저장
public static Object get (String key ); // (키가 가리키는) 현 스레드의 값 반환)
}
문제점
문자열 키가 전역 이름공간에서 공유
각 클라이언트가 고유한 키를 사용하지 않으면? 의도치 않게 같은 변수를 공유하게됨
보안에 취약
악의 적인 클라이언트가 의도적으로 같은 키로 다른 클라이언트 값 가져올 수 있다.
// 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 class ThreadLocal <T > {
public ThreadLocal ();
public void set (T value );
public T get ();
}
개선
정적 메서드를 인스턴스 메서드로 바꿈
ThreadLcocal 삭제하고 Key클래스를 ThreadLcocal로 바꿈
그 자체가 스레드 지역벼눗가 된다.