2010-03-17 7 views
6

Java에서 클래스가 인터페이스 또는 추상 클래스를 통해 public static final 필드를 갖도록 강제하는 방법이 있습니까? 아니면 적어도 공공 분야일까요?클래스가 Java에서 public static final 필드를 갖도록하는 방법은 무엇입니까?

나는 클래스의 그룹 그들에

public static final String TYPE = "...";

을 가지고 어떻게 든 확인해야합니다.

+0

무엇을하려고합니까? 리플렉션을 사용하는 무언가를하고 있습니다. 그렇지 않으면 문제가 없을 것입니다 (필드가'MyClass.field'로 참조되었지만 존재하지 않으면 컴파일되지 않아 암시 적으로 적용되거나 필드가 참조되지 않는 경우에는 상관 없습니다) – ewernli

+0

공장 등을 고려할 수도 있습니다. –

+0

@Tom 왜 매핑 클래스 -> TYPE? 클래스의 정규화 된 이름을 사용하기 만하면됩니다. – ewernli

답변

7

아니요. 불가능합니다.

당신은 각 서브 클래스에 해당하는 값을 반환 비 정적 getter 메소드를 가지고하도록 강제 할 수 있습니다 포함하지 않는

public abstract String getType(); 

당신이 값으로 무엇인가에 대한 각각의 서브 클래스를 매핑해야하는 경우, 인스턴스화가 필요하면 어딘가에서 public static Map<Class<?>, String> types;을 만들고 모든 클래스와 유형으로 정적으로 채우고 TypesHolder.types.get(SomeClass.class)

1

이 방법을 사용할 수는 없지만 작성을 고려해야합니다. 맞춤형 FindBugs 또는이걸 확인할 수있는3210 규칙.

1

나는 그것이 가능하지 않다고 생각합니다. 하지만 당신은 당신이 같은 인터페이스를 정의 할 수 getType로 방법

5

와의 인터페이스를 만들 수 :

interface X { 
    public static final String TYPE = "..."; 
} 

을 당신은 클래스가 다음 에 선언 같은 값으로 해당 필드를해야합니다 그 인터페이스를 구현 할 수 있습니다 인터페이스. 이 연습을 Constant interface anti-pattern이라고합니다.

당신은 클래스가 다음과 같은 인터페이스에서 함수를 정의 할 수 있습니다 다른 값를 원한다면 :

interface X { 
    public String getType(); 
} 

및 클래스를 구현하는 필요에 따라 다른 값을 반환 할 수있는 기능을 구현해야합니다.

참고 :이 기능은 추상 클래스와 유사하게 작동합니다.

+0

+1 : 나는 OP가 가치가 아닌 식별자 만 갖고 싶어한다는 것을 깨닫지 못했기 때문에 또 다른 대답을 downvote하려했습니다. – Pops

0

클래스에 인터페이스를 구현하고 others과 같은 인터페이스에서 메소드를 호출하십시오.

절대적으로 정적 필드가 필요한 경우 클래스를 통과하는 단위 테스트를 만들고 Reflection API으로 모든 클래스의 public static final 필드를 검사 할 수 있습니다. 그렇지 않은 경우 빌드를 실패하십시오.

0

아니면 공개 입력란입니까? 갈 수있는 일반적인 방법은 IMO의

: - 그들은이없는

public abstract class MyAbstract { 

    private final String type; 

    protected MyAbstract(String type) { 
    this.type = type; 
    } 

    public String getType() { 
    return type; 
    } 
} 

이 방법은, 모든 구현이 그 슈퍼 생성자 호출해야합니다 : 슈퍼 클래스에서이 생성자에 값을 필요로 각각 getType()을 구현합니다.

+0

하지만 정적으로 getType()을 호출 할 수는 없습니다. –

+0

아니요, 할 수 없습니다. 그러나 그것은 그의 질문의 두 번째 부분이었다 : "... 공공 정적 인 최종 필드를 가지고 ... 아니면 적어도 공개 필드?" 그래서 나는 그 질문을 다음과 같이 이해합니다. 나는 그것을 정적으로하고 싶습니다. 그러나 가능하지 않다면 적어도 정적이 아닙니다. –

관련 문제