2016-05-14 2 views
0

私はすでに解決策を得るのにかなりの時間を捜しましたが、どれも受け入れられるほど快適ではありませんでした。Java force static field inheritance

抽象クラスがあり、そのすべてのサブクラスが静的で最後のフィールドを提供するとします。

abstract class A { 
    static final Field FOO; 
} 

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

それはこのようなものだ:そこBのインスタンスでなければならず、私は彼らが私は抽象メソッドをしなければならないだろうが、そこに私は再び同じ問題を持っていることを意味し、ゲッターを持っている必要はありません。

ゲッター:

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. 
} 

私は特定の名前(設定値)IがクラスAをadressing際へのアクセス権を持っているとのstatic finalフィールドを持つサブクラスを強制するために何ができますか?

EDIT (私はすでにこの1の上の部分を編集したが、ここで、これは完全に新しいです)実際に

、私が望むすべては、次の操作を実行することです:

私は、抽象を持っていますクラス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(); 
    } 
} 

そして今、 MyClassAのサブクラスのオブジェクトは、最初にこのサブクラスのフィールドを宣言せずにinstatiatedすることはできません。final static Integer foo:あなたがインターフェイスを必要とするよう

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