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

문자열로해서는안되는일

  • 문자열은 값 자료형 (value type)을 대신하기에는 부족

      데이터가 파일, 네트워크, 키보드를 통해서 들어오면 문자열이다
    
    • 숫자라면 int, float, BigInteger 같은 수 자료형으로 변환

    • 예, 아니오 질문의 답은 boolean으로 변환

    • 적절한 값 자료형이 있다면 해당 자료형을 사용

  • 문자열을 enum 자료형을 대신하기에는 부족

  • 문자열은 혼합 자료형(aggregate type)을 대신하기에는 부족

String compoundKey = className + "#" + i.next();
  • 필드 구분자가 필드안에 들어가면 문제 발생
  • 필드 사용하려면 파싱을 해야함 . equals, toString, compareTo 메서드 제공 불가, String의 기능만 사용 가능
  • 혼합 자료형 표현할 클래스를 만들어야한다 종종 private static 멤버 클래스로 선언됨

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

  • 문자열을 권한으로 사용하는 잘못된 예(쓰레드 지역변수 기능을 설계하는 경우)

    • 문자열이 스레드 지역변수의 전역적 이름공간, 클라이언트가 제공하는 문자열 키의 유일성이 보장되어야 함
    • 악의적 클라이언트가 다른 클라이언트와 같은 문자열 사용시 다른 클라이언트의 데이터 접근 가능
public class ThreadLocal {
    private ThreadLocal(){} //객체 생성 불가
    public static void set(String key, Object value){}// 주어진 이름이 가리키는 지역변수의 값 설정
    public static void get(String key){}//주어진 이름이 가리키는 지역변수의 값 반환
}
  • 문자열 대신 위조 불가능(unforgeable) 키로 바꾸면 해결(이런 키를 권한 capability라고 부름)
public class ThreadLocal {
    private ThreadLocal() {} //객체생성불가

    public static class Key { //권한
        Key() { }
    }
    public static Key getKey() {//유일성이 보장되는, 위조 불가능 키를 생성
        return new Key();
    }
    public static void set(String key, Object value) {}
    public static void get(String key) {}
}
  • 정적 메서드를 없애고, 키의 메서드로 바꿈, 키를 지역 변수의 키가 아니라 스레드 지역변수로 고침
public final class ThreadLocal {
 public ThreadLocal() {};
 public void set(Object value) {};
 public Object get() {
  return null;
 };
}
  • 변수에서 꺼낼 때 Object 에서 실제 자료형으로 형변환 형 안정성 제공 못함
  • ThreadLocal 클래스를 제네릭으로 선언하면 형 안정성 보장가능
public final class ThreadLocal<T>{
    public ThreadLocal() {};
    public void set(T value) {};
    public T get() {
        return null;
    };
}

요약

  • 더 좋은 자료형이 있거나 만들 수 있으면 객체를 문자열로 표현하는 것을 피해야 한다.

  • 문자열을 제대로 다루지 못하면 성가시고, 유연성이 떨어지고 오류 발생 가능성이 높음

  • 문자열이 적합하지 않는 자료형은 기본 자료형, enum 혼합자료형이 있다.

results matching ""

    No results matching ""