2014-11-21 7 views
2

내 프로그램의 디자인과 관련하여 질문이 있습니다. 내가 다른 클래스에서 이러한 상수를 사용할 수 있도록 공용 상수를 저장하는 클래스가 있습니다.상수 클래스 용 자바, 인터페이스 또는 컴포지션

public static final String error_code1 = "Fatal Error"; 
public static final String error_code2 = "XXXX"; 
... 
... 

컴포지션과 인터페이스 사이에는 어느 것이 더 적합한 지 알지 못합니다. 내가 생각하기에, 나는 단지 내 프로그램에서 가치 비교를위한 상수가 필요하기 때문에, 나는 구성이 충분하다고 생각한다 (낮은 결합).

하지만 당신은 저에게 소프트웨어의 관점에서 조언/논쟁을 줄 수 있습니까? (응집력, 커플 링, 유지 보수의 어려움)

+0

이것은 Enum으로 완벽하게 해결할 수 있습니다. – Mirco

+0

enum을 사용하는 것이 이상적입니다. 그렇지 않으면 인터페이스로 이동하십시오. –

답변

3

우선이 경우에는 열거 형을 사용하는 것이 좋습니다.

public enum ErrorCode { 
    FATAL_ERROR("Fatal Error"), 
    X_ERROR("XXXX"); 

    public final String msg; 
    private ErrorCode(String msg) { 
     this.msg = msg; 
    } 
} 

이 어떤 이유로 적합하지 않는 경우에, 나는 개인 (사용되지 않는) 생성자와 final 유틸리티 클래스와 함께 갈 것입니다.

필드가 정적이고 마지막이기 때문에 이 아닌은 A에 대한 참조가 있거나 A를 구현하여 상수를 얻는 것을 고려합니다.

+0

private 생성자가있는 최종 클래스보다 인터페이스가 좋지 않습니까? –

+0

이러한 종류의 필드는 클래스의 계약이 아닌 구현 세부 사항입니다. 그것이 "편리하다"고해서 그것이 좋은 생각이라는 것을 의미하지는 않습니다. 당신이 그것을 알기 전에 누군가가 * 상수로의 접근을 단순화하기위한 인터페이스를 구현한다. 2 일 후, 필드가 정적이라는 사실을 모르는 사람은 ErrorConstants 유형의 객체를 전달하기 시작합니다. – aioobe

+0

당신이 옳습니다. 그건 의미가 있습니다. –

1

인터페이스에 상수를 추가하는 것은 인터페이스의 기본 목적이 행동 계약을 정의하는 것이므로 안티 패턴으로 간주됩니다. 열거 형을 사용하거나 열거 형이므로 직접 액세스하십시오.

나쁜 관행
+0

예 인터페이스를 가져야하는 이유 때문에 인터페이스가 상수로 사용되지 않아야한다고 생각합니다. – hades

1

내가 인터페이스에 정적 멤버를 가지고 (그 인터페이스를 구현)로 일정하게 저장하는 인터페이스를 사용하지 않을 것입니다 심지어 이름이 거기에있다는 상수 인터페이스 안티 패턴는 [참조 효과적인 자바] [1] 항목 17 :

상수 인터페이스 패턴 인터페이스 나쁨 사용이다. 클래스가 내부적으로 몇 가지 상수를 사용한다는 것은 구현 세부 사항입니다. 상수 인터페이스를 구현하면이 구현 세부 사항이 클래스의 내 보낸 API로 누수됩니다. 클래스 사용자가 상수 인터페이스를 구현하는 것은 아무런 결과가 아닙니다. 사실, 심지어 그것들을 혼동시킬 수도 있습니다. 더 나쁜 것은, 그것은 약속을 의미합니다 : 클래스가 더 이상 상수를 사용할 필요가 없도록 클래스가 수정되면 여전히 바이너리 호환성을 보장하기 위해 인터페이스를 구현해야합니다. 비 final 클래스가 상수 인터페이스를 구현하면 모든 서브 클래스는 인터페이스의 상수에 의해 오염 된 네임 스페이스를가집니다.

개인적으로 열거 형으로 가고 필요한 경우 오류 코드가 있거나 관련 필드/메서드를 추가 할 수도 있습니다.

0

문자열/int/... 다른 클래스의 상수는 하나의 문제가 있습니다. 사용하는 클래스의 상수 풀로 복사되고 이후에 원래 클래스로 가져 오기가 없습니다. 그런 다음 상수의 값을 변경해야하는 경우 사용하는 클래스는 강제로 다시 컴파일되지 않습니다.

해결책은 인터페이스를 사용하고 해당 인터페이스를 구현하는 것입니다. 아마 추악한. 열거 형을 사용하는 것이 좋습니다.하나 열거를 사용하지 않을 개방 종단 값 도메인의

하지만, 객체 지향 접근 방식 :

abstract class ParseError extends RuntimeException 
class ExpressionExpectedError extends ParseError 
class DigitsMayNotFollowLeadingZeroError extends ParseError 
.. 

하나 ParseError의 모든 하위 클래스를 볼 수 있습니다 javadoc 내에서. 여기서 클래스 자체는 도메인 값을 형성하고 인스턴스화는 실제 컨텍스트 정보를 포함합니다. 그것은 더 많은 OOP입니다. 객체에 대한 여러 메소드 호출은 상수에 여러 스위치를 갖는 것보다 낫습니다. 그러나 열거 형은 범주 형 메서드 인 boolean errorHandledBySkippingToNextExpr()과 함께 사용할 수도 있습니다.