Effective Java73 [Effective Java] 아이템37 ordinal 인덱싱 대신 EnumMap을 사용하라 ■ ordinal 기반 인덱싱 이따금 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. 식물의 생애주기를 열거 타입으로 표현한 LifeCycle 열거 타입을 예로 보자. public class Plant { enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL} final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 이제 정원에 심은 식물들을 배열 하.. 2021. 6. 6. [Effective Java] 아이템36 비트 필드 대신 EnumSet을 사용하라 ■ 비트 필드 열거한 값들이 집합으로 사용될 경우, 예전에는 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해왔다. 아래 코드와 같이 OR 연산자를 사용하여 상수를 하나의 집합으로 모을 수 있으며 이 집합을 비트 필드라 한다. import java.util.Objects; class Text { public static final int STYLE_BOLD = 1 2021. 6. 6. [Effective Java] 아이템35 ordinal 메서드 대신 인스턴스 필드를 사용하라 ■ enum type의 ordinal java.lang 패키지의 Enum 추상 클래스의 내부를 보면 ordinal이라는 정수형 필드가 존재한다. ordinal 필드는 열거 타입 상수가 열거 타입에서 선언된 순서를 가지고 있다. 이 ordinal 필드의 값을 얻기 위해서는 ordinal() 메서드를 호출하면 된다. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians(){ return ordinal() + 1; } } 위의 열거 타입에서 TRIO의 ordinal 값은 선언된 순서로 결정되므로 2이다. numberOfMusicians의 호.. 2021. 6. 6. [Effective Java] 아이템34 int 상수 대신 열거 타입을 사용하라 ■ 정수 열거 패턴 기법 자바에서 열거 타입을 지원하기 전에는 다음 코드처럼 정수 상수를 한 묶음 선언해서 사용하곤 했다. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int ORANGE_NAVEL = 0 public static final int ORANGE_TEMPLE = 1; 정수 열거 패턴 기법에는 단점이 많다. 1. 타입 안전을 보장할 방법이 없으며 표현력이 좋지 않다. 예를들어 APPLE_FUJI를 사용해야할 곳에 ORANGE_NAVEL을 사용해도 둘다 정수 0이기 때문에 컴파일 때 문제가 없다. 또한 이름공간을 지원하지 않기 때문에 접두어를 사용해서 이름 .. 2021. 6. 6. [Effective Java] 아이템33 타입 안전 이종 컨테이너를 고려하라 ■ 리터럴이란? 리터럴은 데이터 그 자체를 뜻 한다. 변수에 넣는 변하지 않는 데이터를 의미하는 것이다. int a = 1; int 앞에 final를 붙일 시 , a는 상수가 된다. 여기서의 리터럴은 1이다. 즉, 1과 같이 변하지 않는 데이터(boolean, char, double, long, int, etc...)를 리터럴(literal)이라고 부른다. ■ Class Class 객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재한다. 그리고 클래스 파일이 ‘클래스 로더(ClassLoader)’에 의해서 메모리에 올라갈 때, 자동적으로 생성된다. ■ 타입 안전 이종 컨테이너 패턴 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어 있다. 하지만 컨테이너.. 2021. 5. 31. [Effective Java] 아이템32 제네릭과 가변인수를 함께 쓸 때는 신중하라 ■ 가변인수와 제네릭을 함께 사용할 경우 헛점 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되기 알기 어려운 컴파일 경고가 발생한다. warning: [unchecked] Possible heap pollution from parameterized vararg type List 매개변수화 타입의 변수가 타입이 다른 객체를 참조하면 힙 오염이 발생한다. 힙오염이란 객체가 특정 제네릭 타입 인스턴스에 속해야하지만 실제로는 다른 인스턴스에 속하는 현상을 의미한다. 다음 메서드를 통해서 확인해보자. static void danfe.. 2021. 5. 30. 이전 1 ··· 4 5 6 7 8 9 10 ··· 13 다음