有什么方法可以强制类在Java中使用public static final字段?

时间:2010-03-17 16:41:54

标签: java class inheritance

有没有办法强制Java中的类具有公共静态final字段(通过接口或抽象类)?或者至少只是一个公共领域?

我需要确定一组课程

public static final String TYPE = "...";

在他们中间。

6 个答案:

答案 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)

没有办法让编译器强制执行此操作,但我会考虑创建一个可以检查此问题的自定义FindBugsCheckStyle规则。

答案 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()。