[Effective Java]일반적인 프로그래밍 원칙들_5

Kim Ji Yun·2021년 11월 28일
0

Effective Java

목록 보기
5/9
post-thumbnail

5. 다른 자료형이 적절하다면 문자열 사용은 피하라

  • 문자열은 값 자료형(value type), enum자료형, 혼합 자료형(aggregate type)을 대신하기엔 부족

ex18) 문자열을 혼합 자료형으로 쓴 부적절한 예제

String compoundKey = className + "#" + i.next();
  • 필드 구분자로 사용한 문자가 필드 안에 들어가버리면 문제 발생
  • 각 필드를 사용시 문자열 파싱에 성능이 느리고 오류 발생 가능성 높음
  • equals, toString, compareTo 메서드 제공 불가
  • String이 제공하는 기능만 사용 가능

문자열은 권한(capability)을 표현하기에 부족

ex19) 문자열을 권한으로 사용하는 부적절한 예제

// 문자열을 권한으로 사용하는, 잘못된 예제 
public class ThreadLocal {
	private ThreadLocal() { } // 객체를 만들 수 없다 
    
    // 주어진 이름이 가리키는 스레드 지역 변수와 값 설정.
    public static void set(String key, Object value);
    
	// 주어진 이름이 가리키는 스레드 지역 변수의 값 반환.
    public static Object get(String key);
}
  • 문자열이 스레드 지역 변수의 전역적인 이름공간임
  • 다른 클라이언트와 같은 지역 변수명을 사용한다면 동일한 변수를 공유하게 되어 오류 발생

ex20) 문자열을 위조 불가능(unforgeable) 키로 변경

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);
}

ex21) 정적 메서드 -> 키의 객체 메서드

  public final class ThreadLocal {
    public ThreadLocal();
    public void set(Object value);
    public Object get();
}
  • 정적메서드들은 사실 더 이상 필요 없음
  • 키의 객체 메서드(instance method)로 생성
  • 키는 더 이상 스레드 지역변수가 아닌 자체가 스레드 지역 변수가 됨

ex22) 형 안전성을 보장하기 위해 제네릭으로 선언

public final class ThreadLocal<T> {
    public ThreadLocal();
    public void set(T value);
    public T get();
}

0개의 댓글