NMP-Study / EffectiveJava2022

Effective Java Study 2022
5 stars 0 forks source link

아이템 36. 비트 필드 대신 EnumSet을 사용하라 #36

Closed okhee closed 2 years ago

windowforsun commented 2 years ago

한줄 요약

EnumSet 을 사용하자!

비트 필드

열거한 값들이 주로 집합으로 사용되는 경우 열거 패턴(#34 )사용해서 표현 가능하다.

    public class Text {
        public static final int STYLE_BOLD = 1 << 0;            // 1
        public static final int STYLE_ITALIC = 1 << 1;          // 2
        public static final int STYLE_UNDERLINE = 1 << 2;       // 4
        public static final int STYLE_STRIKETHROUGH = 1 << 3;   // 8

        // 매개변수는 0개 이상의 STYLE_ 상수를 OR 한 값
        public void applyStyle(int styles) {

        }
    }

// OR 연산을 통해 2개의 비트를 하나의 비트로 만들어 집합 전달
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

비트 필드를 사용하는 이유 ? n개의 열거값을 저장하기 위해 변수를 사용할때 최소한의 메모리를 사용해서 저장할 수 있다. 열거 변수 타입이 int 인 경우 저장 가능한 상태 값은 32개, long 은 64개 이다.

스타일 연산 비트필드
BOLD + ITALIC 1 | 2 = 3 0011
BOLD + UNDERLINE 1 | 4 = 5 0101
ITALIC + UNDERLINE 2 | 4 = 6 0110

장점

단점

EnumSet

우리에겐 java.util.EnumSet 이 있다.

    public static class Text {
        public enum Style {
            BOLD, ITALIC, UNDERLINE, STRIKETHROUGH
        }

        public void addStyles(Set<Style> styles) {

        }
    }

text.addStyles(EnumSet.of(Text.Style.BOLD, Text.Style.ITALIC));
Set<Style> immutableEnumSet = Collections.unmodifiableSet(EnumSet.of(Style.BOLD, Style.UNDERLINE));

// add, remove, clear 등의 수정 발생시 UnsupportedOperationException 발생