【问题标题】:How to mandate a constant in Java如何在 Java 中指定一个常量
【发布时间】:2014-01-24 13:05:02
【问题描述】:

我正在使用 JAX-RS 创建 REST Web 服务。

我需要使我的Resource 类上的@Path 注释的值可公开访问。使用反射来获取这个值似乎有点繁重。

我想我会将值保存在public static final String 中,这样@Path 注释和其他类都可以访问它。

强制类提供此常量的最佳方式是什么?我的印象是在接口中使用常量是一种反模式(Effective Java 2nd Edition)。

编辑:

正如 Effective Java 所指出的,“如果常量与现有的类或接口紧密相关,则应将它们添加到类或接口中”。

在我的情况下,接口的所有实现者的@Path 将是相同的,并且接口将提供方法,所以我认为我可以安全地将常量添加到接口。

【问题讨论】:

  • 给私有字段添加getter方法?
  • 有效的 java 并没有说在接口中使用常量是一种反模式。它说仅将接口用于常量是一种反模式,“常量接口”是一种反模式。

标签: java interface constants


【解决方案1】:

既然你已经有the book,我会为你引用它(第98-99页):

如果要导出contants,有几种合理的选择。 如果常量与现有的类或接口紧密相关, 您应该将它们添加到类或接口中。例如,所有的 盒装数值基元类,例如 Integer 和 Double,导出 MIN_VALUE 和 MAX_VALUE 常量。如果常数最好被视为 枚举类型的成员,您应该使用枚举导出它们 类型。否则,您应该使用 不可实例化的实用程序类。


但是,上面的答案涉及导出常量。如果你想“强制一个类提供这个常量”,那是另一回事,在你的界面中拥有常量并不能做到这一点。您可以强制执行此类操作的唯一方法是在您的界面中为其设置一个 getter。

【讨论】:

  • +1 特别是对于 否则,您应该使用不可实例化的实用程序类导出常量。
  • 我是否正确地认为如果我的接口中有一个吸气剂,我就无法在我的@Path 注释中访问它?
  • @retrodev 没有这方面的经验,但我猜你应该可以访问它。
【解决方案2】:

如果这是一个选项,您可以简单地将功能添加为一种简单的方法。 static 在继承方面存在某些问题,并不总是一个好主意。

interface HasPath {
    String getPath();
}

class Foo implements HasPath {
    private static final String PATH = "/my/path";

    @Override
    public void String getPath() {
        return PATH;
    }

    @Annotated(PATH) void foo() { }
}

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2012-09-29
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多