GitHub
Search
Java에서 Enum을 지원하기 전에는 아래와 같이 정수 상수를 한 곳에 선언해서 사용하곤 했다
이러한 방식을 정수 열거 패턴(int enum pattern)이라고 하는데, 여기에는 단점이 많다
정수 열거 패턴(int enum pattern)의 단점
•
타입 안전을 보장할 방법이 없다
•
표현력이 좋지 않다
•
정수 상수는 문자열로 출력하기 다소 까다롭다
•
같은 정수 열거 그룹에 속한 모든 상수를 한 바퀴 순회하는 방법도 마땅치 않다
문자열 열거 패턴(string enum pattern)은 더욱 좋지 않은 방법이다
상수의 의미를 출력할 수 있다는 장점만 있을 뿐, 하드코딩이 불가피하며 오타가 있어도 컴파일러가 확인할 방법이 없다.
또한, 문자열 비교에 따른 성능 저하 역시 발생한다
열거 타입(Enum Type)? JLS 8.9
[Item-34] int 상수 대신 열거 타입을 사용하라
Effective Java 3E
람다는 직렬화 해서는 안되는 이유
람다도 익명 클래스처럼 직렬화 형태가 구현별로(가령 가상머신별로) 다를 수 있다. 따라서 람다를 직렬화하는 일은 극히 삼가야 한다(익명 클래스의 인스턴스도 마찬가지다) - p.285 -
오라클 공식문서에서도 람다 표현식과 익명 클래스에 대한 직렬화를 '강력하게' 권장하지 않다
그 이유는 람다 표현식이나 익명 클래스에 대해서 직렬화를 할 때, 자바 컴파일러가 특정 구문에 대해서 Synthetic constructs(인조 구문이 맞는 번역 같음)을 삽입하는데 이 Synthetic constructs는 컴파일러의 구현 방식에 따라서 다를 수 있다. 이 의미는 '.class' 파일도 컴파일러 구현에 따라 다를 수 있음을 의미한다. [내용 보기]
결과적으로 위의 이유에 의해서 다른 컴파일러를 사용하고 있는 경우 호환성의 문제가 발생할 수 있기 때문에 직렬화를 하는것은 강하게 권장하지 않는다!
람다를 직렬화 하는 방법
하지만 때에 따라서 람나 표현식이나 익명 클래스가 포함된 클래스를 직렬화를 해야할 때도 있을 수 있다
먼저, 람다가 정의된 클래스를 냅다 직렬화/역직렬화를 해보자
[Item42] 람다는 직렬화 해서는 안된다
Effective Java 3E