【问题标题】:Any way to force classes to have public static final field in Java?有什么方法可以强制类在 Java 中具有公共静态最终字段?
【发布时间】:2011-01-28 16:15:38
【问题描述】:

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

我需要以某种方式确保一组类具有

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

在其中。

【问题讨论】:

  • 你想做什么?你正在做一些使用反射的事情,对吧?否则你不会有问题(如果该字段被 MyClass.field 引用但不存在它不会编译,因此它被隐式强制执行,或者在这种情况下你不关心该字段未引用)跨度>
  • 你可能想考虑一个工厂或类似的。
  • @Tom 为什么要使用映射 Class -> TYPE ?只需使用类的完全限定名称即可。
  • 公共字段不好......如果有人依赖它们,并且有一天你更改了字段,客户端代码就会中断
  • @Helper 客户端代码仅在 static final 字段使用 编译时间常量 (如 JLS 定义 - 本质上是原始字符串、文字、运算符)初始化时复制值,没有方法调用,没有空值)。

标签: java class inheritance


【解决方案1】:

你可以这样定义一个接口:

interface X {
   public static final String TYPE = "...";
}

您可以让类实现该接口,然后该接口将具有具有在接口中声明的相同值的该字段。请注意,这种做法称为Constant interface anti-pattern

如果您希望类具有不同的值,那么您可以在接口中定义一个函数,如下所示:

interface X {
   public String getType();
}

实现类必须实现可以根据需要返回不同值的函数。

注意:这同样适用于抽象类。

【讨论】:

  • +1:我正要否决另一个答案,因为我没有意识到 OP 只想拥有相同的标识符,而不是值。
【解决方案2】:

在您的类中实现一个接口并从该接口调用一个方法,就像others 建议的那样。

如果你必须绝对有一个静态字段,你可以进行一个单元测试,它将遍历这些类并使用Reflection API 检查每个类是否都有该公共静态最终字段。如果不是这种情况,则构建失败。

【讨论】:

    【解决方案3】:

    或者至少只是一个公共领域?

    这是 IMO 通常的做法:在超类中,在构造函数中需要一个值:

    public abstract class MyAbstract {
    
      private final String type;
    
      protected MyAbstract(String type) {
        this.type = type;
      }
    
      public String getType() {
        return type;
      }
    }
    

    这样,所有实现都必须调用该超级构造函数 - 并且它们不必每个都实现 getType()。

    【讨论】:

    • 但是不能静态调用getType()。
    • 不,你不能。但这是他问题的第二部分:“......拥有公共静态最终字段......或者至少只是一个公共字段?”所以我把这个问题理解为:我想静态地做,但如果那不可能,那么至少是非静态的。
    【解决方案4】:

    不,你不能。

    您只能强制他们使用非静态 getter 方法,该方法将为每个子类返回适当的值:

    public abstract String getType();
    

    如果你需要将某事物的每个子类映射到一个值,而不需要实例化它,你可以在某处创建一个public static Map<Class<?>, String> types;,用所有类及其类型静态填充它,并通过调用@获取类型987654323@

    【讨论】:

      【解决方案5】:

      我认为这是不可能的。但是你可以用 getType 方法创建一个接口

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 2015-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 2012-08-18
          • 1970-01-01
          相关资源
          最近更新 更多