2010-08-10 100 views
3

我有許多類擴展的抽象基類。我希望所有這些類爲基類中最初定義的特定屬性定義一個唯一值(類似於在從Serializable繼承的類中未定義類時會導致警告的serialVersionUID屬性)。Java:我可以要求子類來定義屬性值嗎?

在我的抽象基類中,我有沒有辦法聲明一個沒有值的屬性,但需要所有擴展類爲它定義一個值?

請注意,該值不必與每個單獨的實例相關聯,即:它可以定義爲static

編輯:我想一個更基本的問題,我也應該問,因爲答案相差如此廣泛,是怎樣的Java實現serialVersionUID(在其簽名的條款),使得我的IDE提出警告,它沒有規定什麼時候?

+2

'serialVersionUID'僅僅是序列化機制發生尋找(通過內省)一個普通的領域。它的存在不是由Java語言強制執行的,這正是爲什麼你的IDE發出警告的原因;如果這個值真的需要,那麼當缺席時這將是一個強制性錯誤。 – 2010-08-10 22:30:29

回答

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 2010-08-10 22:19:45

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()構造函數不帶任何參數外,還有調用超級本身時定義的'aValue'屬性來調用'super()'。不過,這似乎更像是一種黑客行爲,而不是我認爲的其他可能性。 – 2010-08-10 21:57:08

+0

也是好方法。但他說他每個類需要一個值(不是對象),所以_Child_構造函數並不需要參數。 – 2010-08-10 21:57:09

+0

好點。我錯過了,Nikkita。 – Mike 2010-08-10 21:58:19

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"); 
    } 
} 

你不要有一個靜態的屬性值,但。

相關問題