有没有办法强制Java中的类具有公共静态final字段(通过接口或抽象类)?或者至少只是一个公共领域?
我需要确定一组课程
public static final String TYPE = "...";
在他们中间。
答案 0 :(得分:7)
不,你不能。
你只能强制它们有一个非静态的getter方法,它会为每个子类返回适当的值:
public abstract String getType();
如果需要将某个子类的每个子类映射到一个值而不需要实例化它,可以在某处创建一个public static Map<Class<?>, String> types;
,用所有类及其类型静态填充它,并获取类型致电TypesHolder.types.get(SomeClass.class)
答案 1 :(得分:5)
您可以定义如下界面:
interface X {
public static final String TYPE = "...";
}
您可以让类实现该接口,然后该接口将与接口中声明的值相同。请注意,此做法称为Constant interface anti-pattern。
如果您希望类具有不同的值,那么您可以在界面中定义一个函数,如下所示:
interface X {
public String getType();
}
并且实现类必须实现可以根据需要返回不同值的函数。
注意:这与抽象类的工作方式类似。
答案 2 :(得分:1)
没有办法让编译器强制执行此操作,但我会考虑创建一个可以检查此问题的自定义FindBugs或CheckStyle规则。
答案 3 :(得分:1)
我不认为这是可能的。但是你可以使用getType方法创建一个接口
答案 4 :(得分:0)
在类中实现一个接口,并从该接口调用一个方法,如others建议的那样。
如果你必须拥有一个静态字段,你可以进行一个单元测试,它将通过类和Reflection API检查,每个类都有该公共静态最终字段。如果不是这样,那么构建失败。
答案 5 :(得分:0)
或者至少只是一个公共领域?
这是IMO常用的方法:在超类中,需要构造函数中的值:
public abstract class MyAbstract {
private final String type;
protected MyAbstract(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
这样,所有实现都必须调用该超构造函数 - 而且它们不必每个都实现getType()。