我已经搜索了相当多的时间来找到解决这个问题的方法,但没有一个能让人接受。
假设我们有一个抽象类,它的所有子类都应提供一个静态和最终字段。
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.
}
在寻址类 A 时,我可以做些什么来强制子类具有一个具有特定名称(和设定值)的静态最终字段?
事实上,我只想做以下事情:
我有一个名为
Component
的抽象类。我想制作一个从插件中获取其他类的程序。这些类应该从Component
继承一些字段和方法。他们还应强制拥有静态 ID。现在的问题是:我如何强制类(由插件提供)具有这样的字段?
我真的不知道如何强制 Java 编译器在编译时检查这个,
但它可以在运行时完成,使用反射 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 的子类的对象:
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;
}