2016-05-14 158 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