상수 인터페이스(Constant Interface)

<aside> 💡 시작 전, 인터페이스의 용도에 대해 정확히 상기 시키자. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기해주는 것이다. 인터페이스는 이 용도로만 사용해야 한다.

</aside>

상수 인터페이스 란, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 의미한다.

보통 이러한 상수들을 사용하려는 클래스에서 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현한다.

하지만, 이는 안티패턴이다. 이유는 아래와 같다.

이처럼 상수 인터페이스를 Implements 했을 때, 대부분 문제가 발생한다.

정확히 말하면 상수 인터페이스를 쓰는것이 안티패턴이 아니라, Implements 해서 사용하는 것 안티패턴

인 것이다.!!

상수 인터페이스를 모아 명확히 패키지 명을 지어준다면, Implements 하는 일이 없을 거라 예상되지만 결국 Implements 가능성을 열어 두는 것이다.

개인 의견 상수 인터페이스의 다양한 의견이 있지만, 초기 인터페이스의 용도에서 말했듯이 인터페이스는 공통되는 관심사항을 추상화하고 각 클래스가 구현하도록 설계하는 것이 목적이다. 즉, 각 클래스의 동작 방식을 규정하기 위해 사용되는 것이지 단순히 클래스에 사용될 상수를 제공하는 용도는 적합하지 않다.

만약 사용을 한다면, 아래와 같은 방법이 더 합당한 선택지 일 것이다.

  1. 특정 클래스, 인터페이스에 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해 사용한다. ex. Integer.MIN_VALUE
  2. 열거 타입으로 나타내기 적합한 상수라면 열거 타입(enum)으로 만든다.