728x90
반응형

Effective Java 67

[Effective Java] 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라.

🎯 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } ordinal()을 배열 인덱스로 사용 - 따라 하지 말 것! public static void main(String[] args) { Plant[] garden = { new P..

Java 2023.03.21

[Effective Java] 아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라.

🎯 아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라. 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공한다. public enum RoleType { USER, ADMIN; } @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.ORDINAL) private RoleType roleType; } 위 처럼 javax.persistence에서 제공하는 타입을 enum으로 지정하는 @Enumerated을 제공해준다. @Enumerated 애..

Java 2023.03.21

[Effective Java] 아이템 34. int 상수 대신 열거 타입을 사용하라.

🎯 아이템 34. int 상수 대신 열거 타입을 사용하라. 정수 열거 패턴 - 상당히 취약하다! public class IntegerConstants { public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; } 위 같은 정수 열거 패턴은 타입 안전을 보장할 방법이 없으며 표현력도 좋지 않다. 오렌지를 건네..

Java 2023.03.21

[Effective Java] 아이템 33. 타입 안정 이종 컨테이너를 고려하라.

🎯 아이템 33. 타입 안정 이종 컨테이너를 고려하라. ⭐ 이종 컨테이너 패턴(type safe heterogeneous container) click here. 컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어 있다. 하지만 컨테이너 자체가 아닌 키를 타입 매개변수로 바꾸면 이런 제약이 없는 타입 안전 이종 컨테이너를 만들 수 있다. 타입 안전 이종 컨테이너는 Class를 키로 쓰며, 이런 식으로 Class 객체를 타입 토큰이라 한다. 또한, 직접 구현한 키 타입도 쓸 수 있다. 예컨대 데이터베이스의 행을 표현한 DatabaseRow 타입에는 제네릭 타입 Column를 키로 사용할 수 있다. public class Favorites { // ..

Java 2023.03.21

[Effective Java] 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라.

🎯 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라. 가변인수 메서드와 제네릭은 자바 5 때 함께 추가되었으니 서로 잘 어우러지리라 기대하겠지만, 슬프게도 그렇지 않다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 구현 방식에 허점이 있다. 제네릭과 가변인수를 혼용하면 타입 안정성이 깨진다! static void dangerous(List... stringLists) { List intList = List.of(42); Object[] objects = stringLists; objects[0] = intList; // 힙 오염 발생 String s = stringLists[0].get(0); // ClassCastException } 위 처럼 타입 안전성이 ..

Java 2023.03.21
728x90
반응형