2010-08-10 4 views
3

나는 많은 클래스가 확장하는 추상 기본 클래스를 가지고있다. 이 모든 클래스는 원래 기본 클래스 (serialVersionUID 속성과 유사하여 Serializable에서 상속 한 클래스에서 정의되지 않은 경우 경고를 발생시키는 속성)에 대해 고유 한 값을 정의하려고합니다.자바 : 속성 값을 정의하기 위해 하위 클래스를 요구할 수 있습니까?

내 추상 기본 클래스 내에서 값이없는 속성을 선언 할 수있는 방법이 있습니까?하지만 모든 확장 클래스에 값을 정의해야합니까?

값을 각 개별 인스턴스에 연결할 필요가 없음을 의미합니다. 즉, static으로 정의 할 수 있습니다.

편집

: 답변 그것이 정의되지 않은 때, 어떻게 자바 내 IDE가 경고를 제기 serialVersionUID (그 서명의 관점에서) 구현 등 않습니다되어 매우 다양하기 때문에 나는, 나는 또한 요청해야 더 기본적인 질문을 추측?

+2

는'serialVersionUID' 직렬화 기계가 (반성을 통해)을 찾기 위해 일어나는 평범한 필드입니다. Java 언어에 의해 존재가 존재하지 않기 때문에 IDE가 경고를 발행하는 이유입니다. 가치가 정말로 필요하다면 결석 할 때 의무적 인 오류가 될 것입니다. –

답변

2

필드를 재정의 할 수는 없지만 메서드를 사용할 수 있습니다. 당신이 값이 일정하다는 적용하지 필요한 경우 사용

class abstract Super() { 
    /** 
    * @return the magic value 
    */ 
    abstract MyType getValue(); 
} 

것은 당신이 필드가 최종하도록 강제해야하는 경우, 당신은 스티브 또는 마이크의 답변에서와 같이 각 인스턴스에게 자신의 복사/참조를 제공 할 수 있습니다 .

당신처럼 미친 물건을 할 수 있습니다 그렇게 할 수없는 경우

class Super() { 
    private static Map<Class<? extends Super, MyType> map = new ...; 

    protected Super(MyType value) { 
     if (!map.contains(getClass())) { 
      map.put(getClass(), value); 
     } else { 
      assert map.get(getClass(), value) == value; 
     } 
    } 
} 
1

거의 없습니다. 기본 클래스의 javadoc에 사용자 지침을 넣고 속성을 사용하기 전에 해당 속성이 있는지 확인하는 것이 좋습니다. object.class.getDeclaredField("MY_CONSTANT")

나는 생각합니다. Serializable 인터페이스가 그러한 접근의 좋은 예입니다.

+0

아마도 슈퍼 생성자에서 필드의 존재를 확인하는 것이 적절할 수 있습니다. – meriton

1

내가 놓친 기준에 맞게 재개시 : 다음과 같은

public abstract class Abstract { 

    private static int field; 

    public Abstract(int aValue) { 
     field = aValue; 
    } 

    public int getField() { 
     return field; 
    } 
} 

public class Child extends Abstract { 

    private static final int value; 

    static { 
     value = 10; //Pick a value for each class. 
    } 

    public Child() { 
     super(value); 
    } 
} 
+0

이것은'Child()'생성자가 매개 변수를 사용하지 않고 super 자체 호출에 정의 된 aValue 속성을 사용하여'super()'를 호출하는 것을 제외하고는 지금 당장하고 있습니다. 그래도 다른 가능성이 있다고 생각하는 것보다 더 많은 해킹처럼 보입니다. –

+0

또한 좋은 방법입니다. 그러나 그는 클래스 (객체가 아닌)마다 하나의 값이 필요하다고 말합니다. 따라서 _ 생성자는 매개 변수를 필요로하지 않습니다. –

+0

좋은 지적. 나는 그것을 놓쳤다, Nikkita. – Mike

0

뭔가 이것에 일반적인 방법입니다 :

public abstract class Superclass { 

    private final String something; 

    public Superclass(String something) { 
     this.something = something; 
    } 

    public String getSomething() { 
     return something; 
    } 
} 

public class Subclass { 

    public Subclass() { 
     super("a value for something"); 
    } 
} 

당신은 비록 정적 속성 값을 가지고하지 않습니다.

관련 문제