<이펙티브 자바> 6. 열거 타입과 애너테이션
by BFine반응형
www.yes24.com/Product/Goods/65551284
6장
- 특수 목적 참조 타입 두가지
- 어노테이션
- 열거타입
36. int 상수 대신 열거타입을 사용하자
-
static int,String 패턴의 단점
- 타입 안전 보장이 되지않음
- 표현력이 안좋음
- 컴파일러 경고가 뜨지않음
- String은 오해 할 수 있음
-
Enum 타입
-
자체는 클래스 형태, public 생성자를 제공하지 않음
-
상수 하나당 자신의 인스턴스를 만들어 public static final 필드로 공개
-
싱글턴을 일반화한 형태
-
각자 이름공간이 존재
-
메서드, 필드, 인터페이스 구현가능
-
필드를 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 됨
-
열거 타입마다 메서드 정의 가능
PLUS {public double apply(double x, double y){return x + y;}}, MINUS{public double apply(double x, double y){return x - y;}} public abstract double apply(double x, double y); // abstract로 재정의 해야함
-
필요한 원소를 컴파일타임에 다알 수 있는 상수 집합 이라면 항상 열거 타입을 사용하자
-
-
전략 enum패턴
enum PayrollDay{ MONDAY(WEEKDAY),SUNDAY(WEEKEND); private final PayType payType; PayrollDay(PayType payType){ this.payType = payType; } enum PayType{ WEEKDAY{...}, WEEKEND{...}; } }
- 상수별 동작을 혼합해 넣을때는 switch문이 좋은 선택이 될수는 있다.
35. ordinal 메서드 대신 인스턴스 필드를 사용하자
- ordinal 열거타입에서 몇번째인지 알려주는 메서드
36. 비트필드 대신 EnumSet을 사용하자
- EnumSet 내부는 비트 벡터로 구현
- 아직 불변이 아니므로 Colletions.unmodifiableSet으로 감싸 사용할 수도 있다.
37. ordinal 인덱싱 대신 EnumMap을 사용하자
38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하자
-
열거 타입을 확장하는건 좋지 않지만 연산코드 정도는 인터페이스로 가능하다
- 열거 타입은 확장할 수 없고 인터페이스로 가능하다
-
<T extends Enum<T> & Operation>
class 객체가 열거 타입인 동시에 Operation의 하위 타입이어야 한다.
39. 명명 패턴보다 애너테이션을 사용하자
-
명명 패턴 단점
- 오타나면 안됨
- 의도하지 않은 곳에서 사용될 수 있음
- 매개변수로 전달하기 힘듬
-
JUnit 어노테이션
- 어노테이션 선언에 다는 어노테이션을 메타어노테이션이라고 한다.
@Retention(RetentionPolicy.RUNTIME) // @Test가 런타임에도 유지 되어야한다. @Target(ElementType.METHOD) // 메서드에만 사용돼야한다. public @interface Test{ } public static void main(String[] args){ // @Test 처리 Class<?> testClass = Class.forName(args[0]); for(Method m : testClass.getDeclareMethods()){ if(m.isAnnotationPresent(Test.class)){ } } } @Retention(RetentionPolicy.RUNTIME) // @Test가 런타임에도 유지 되어야한다. @Target(ElementType.METHOD) // 메서드에만 사용돼야한다. public @interface ExceptionTest{ Class<? extends Throwable> value() // 매개변수하나 Class<? extends Throwable>[] value{} // 배열형태 {Exception2,Exception2,...} -> java8에서는 @Repeatable 등장(Container를 재정의해야함) // @ExceptionTest 여러개 달아서 가독성 업 }
40. @Override 어노테이션을 일관되게 사용하자
41. 정의하려는 것이 타입이면 마커 인터페이스를 사용하자
- 아무 메서드가 없고 구현클래스에 특정속성을 가지는 것을 표시하는 인터페이스
- vs 마커 어노테이션
- 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸수 있지만 어노테이션은 불가능
- 적용 대상을 더 정밀하게 지정
반응형
'개발서적 > 이펙티브 자바' 카테고리의 다른 글
<이펙티브 자바> 8. 메서드 (0) | 2021.01.21 |
---|---|
<이펙티브 자바> 7. 람다와 스트림 (0) | 2021.01.17 |
<이펙티브 자바> 5. 제네릭 (0) | 2021.01.14 |
<이펙티브 자바> 4. 클래스와 인터페이스 (0) | 2021.01.12 |
<이펙티브 자바> 3. 모든 객체의 공통 메서드 (0) | 2021.01.11 |
블로그의 정보
57개월 BackEnd
BFine