[이펙티브 자바 3판] 아이템 34. int 상수 대신 열거 타입을 사용하라

김민우·2022년 9월 12일
0

Bangu

목록 보기
1/1

enum 타입이 등장하기 전에는 정수 열거 패턴(int enum pattern) 을 사용했었다.

public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;

public static final int ORANGE_NEVEL = 0;
public static final int ORANGE_TEMPLE = 1

But, 정수 열거 패턴 상수가 타입에 안전하지 않고, 코드가 길어지는 문제점이 있다.

또한 이펙티브 자바 아이템 35에서, ordinal 메서드 대신 인스턴스 필드를 사용하라 -> 왜? 상수의 선언을 바꾸는 순간 바로 오동작을 할 수 있으며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 수도 없기 때문이라고 나와 있음

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10),
    DOUBLE_QUARTET(8), TRIPLE_QUARTET(12);

    private final int int numberOfMusicians;
    Ensemble(int size) { this.numberOfMusicians = size; }
    public int numberOfMusicians() { return numberOfMusicians; }
}

[리팩토링 코드]

그래서 내 프로젝트에서 여러 클래스의 상수를 Enum 클래스에서 관리하기로 결정했다.

// domain/ottNames.enum
package com.ott.ott_server.domain.enums;

public enum OttNames {
    NETFLIX("NETFLIX"),
    TVING("TVING"),
    WATCHA("WATCHAPLAY"),
    WAVVE("WAVVE");

    private final String value;

    OttNames(String value){
        this.value = value;
    }

    public String value() {
        return value;
    }

}

이런 식으로 OttNames Enum 클래스를 제작하여, 인스턴스 필드에 값을 넣어 value로 반환하는 식으로 변경!

// ReviewService.class
private void checkSubscribe(MovieRequestData movieRequestData, Movie movie) {
        if (movieRequestData.getMovieOttRequestData().isNetflix()) {
            Ott ott = findIdByOttName(OttNames.NETFLIX.value());
            setMovieOtt(movie, ott);
        }
        if (movieRequestData.getMovieOttRequestData().isTving()) {
            Ott ott = findIdByOttName(OttNames.TVING.value());
            setMovieOtt(movie, ott);
        }
        if (movieRequestData.getMovieOttRequestData().isWatcha()) {
            Ott ott = findIdByOttName(OttNames.WATCHA.value());
            setMovieOtt(movie, ott);
        }
        if (movieRequestData.getMovieOttRequestData().isWavve()) {
            Ott ott = findIdByOttName(OttNames.WAVVE.value());
            setMovieOtt(movie, ott);
        }

    }

각 OTT별 문자열이 필요할 때, enums를 통해 불러온다!

profile
Backend Developer

0개의 댓글