DEV ℧ Developer Diary

[EffectiveJava] item41 - 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스(marker interface)라 한다.

Serializable 인터페이스가 좋은 예다.
Serializable는 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화(Serialization)할 수 있다고 알려준다.

public interface Serializable <span...

[EffectiveJava] item40 - @Override 애너테이션을 일관되게 사용하라

@Override는 메서드 선언에만 달 수 있으며, 이 애너테이션이 달렸다는 것은 상위 타입의 메서드를 재정의했음을 뜻한다.

이 애너테이션을 일관되게 사용하면 여러가지 악명 높은 버그들을 예방해 준다.

다음 예제를 살펴보자. 다음 예제에는 버그 두가지가 있다. 무엇일까?

public class <span...

[EffectiveJava] item39 - 명명 패턴보다 애너테이션을 사용하라

전통적으로 도구나 프레임워크가 특별히 다뤄야할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해왔다.

명명 패턴

예를들어, 유명한 테스트 프레임워크중 하나인 JUnit은 버전3까지 테스트 메서드의 이름을 test로 시작하게 하였다. 효과적인 방법이지만 단점도 컸다.

첫번째로, 오타에 취약하다. test를 tset와 같은 오타가 날 경우, JUnit3는 이 메서드를 무시하고...

[EffectiveJava] item38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

열거 타입은 거의 모든 상황에서 이 책초판에서 소개한 타입의 안전 열거 패턴보다 우수하다.

단, 예외가 하나 있으니, 타입 안전 열거 패턴은 확장할 수 있으니 열거 타입은 그럴 수 없다는 점이다.
달리 말하면, 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여...

[EffectiveJava] item37 - ordinal 인덱싱 대신 EnumMap을 사용하라

이따금 배열이나 리스트에 원소를 꺼낼 때 ordinal 메소드로 인덱스를 얻는 코드가 있다.

class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name;...