2016-05-14 91 views
0

我已經搜索了相當多的時間來得到這個解決方案,但沒有一個人足夠舒適以便被接受。爪哇力靜態字段繼承

假設我們有一個抽象類,它的所有子類都將提供一個靜態和最終字段。

abstract class A { 
    static final Field FOO; 
} 

class B extends A { 
    static final Field FOO = new Field("foo"); 
} 

是這樣的:應爲B的情況下,我不希望他們有一個getter,這意味着我將不得不作出一個抽象的方法,但我再次有同樣的問題。

消氣:

abstract class A { 
    static final Field FOO; 
    public Field getFOO() { return A.FOO; } 
     // This method is not that great as I need it to be static. 
     // Also, as it refers to class A, but if I want to let B inherit this method it won't refer to B.FOO. 
    public static Field getFOO() { return FOO; } 
     // This method is not inherited due to being static. 
     // Because it is not inherited, it can't be what I want. 
} 

我能做些什麼來強制具有特定名稱(設定值),我有機會adressing A級時,靜態最終場的子類?

編輯(我已經編輯上面這一個部分,但在這裏,這是全新的)

其實,我要的是要做到以下幾點:

我有一個抽象這個類叫做Component。我想製作一個從插件獲取其他類的程序。這些類應繼承Component的一些字段和方法。他們也將被迫擁有一個靜態ID。現在的問題是:我如何強制類(由插件提供)擁有這樣的字段?

+0

聽起來像是你需要一個接口。 –

+1

你的情況還不清楚。您提供的代碼將無法編譯(因爲您沒有給'A'中的'FOO'賦值)。此外,您不清楚什麼是抽象類和您正在討論的子類,因爲代碼中的任何類都不是抽象的,也不是除「Object」之外的任何子類。你能給出一個實際顯示你正面臨的情況的代碼示例嗎?你在談論什麼你想避免的吸氣劑? – RealSkeptic

+2

您的問題實際上可能是一個[XY問題](http://mywiki.wooledge.org/XyProblem),當您最好的解決方案是完全使用不同的方法時,您會問「如何解決此代碼問題」。考慮告訴我們你試圖解決的整體問題,而不是你目前試圖解決的問題,因爲再次,你的方法可能是錯誤的。 –

回答

0

我真的不知道如何強制一個Java comiler在編譯時檢查此,
但它可以在運行時完成,使用反射API:

public class MyClassA { 

    static final Integer foo = 123; 

    public MyClassA(){ 
     try { 
      Field f = this.getClass().getDeclaredField("foo"); 
      int fooModifiers = f.getModifiers() ; 
      if(fooModifiers != (Modifier.FINAL | Modifier.STATIC)) 
      { 
       throw new RuntimeException("Each subclass of MyClassA must declare a field: static final Integer foo = value"); 
      } 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e){ 
      throw new RuntimeException("Each subclass of MyClassA must declare a field: static final Integer foo = value", e); 
     } 
    } 

    public static void main(String ... x){ 
     MyClassA m = new MyClassA(); 
    } 
} 

現在的final static Integer foo:MyClassA的子類的對象不能沒有這個子類第一聲明字段instatiated

public class MyClassB extends MyClassA{ 

    public static void main(String ... x){ 
     MyClassB m = new MyClassB(); 
     System.out.println("I am main"); 
    } 

    // final Integer foo = 444; 
    // final private Integer foo = 444; 
    static Integer foo = 555; 
    // static final Integer foo =333; 
} 
+0

這看起來好像滿足了我所滿意的目的,但是反射減慢了代碼的速度。因爲我可能只需要在實例化時進行檢查,所以我可能會創建使用反射的虛擬類,然後使用它們的子類。這可能是一個好主意嗎? – ChaosNe0