如何在Java中强制使用常量

时间:2014-01-24 13:05:02

标签: java interface constants

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

我需要在@Path类上公开Resource注释的值。使用反射来获得这个值似乎有点沉重。

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

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

修改

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

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

2 个答案:

答案 0 :(得分:5)

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

  

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


但是,上面的答案涉及导出常量。如果你想“强制一个Class提供这个常量”,那就是另一回事,并且你的界面中有常量并不能做到这一点。只有你可以强制执行这样的事情的方法是在你的界面中为它设置一个吸气剂。

答案 1 :(得分:0)

如果这是一个选项,您可以简单地将功能添加为一个简单的方法。 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() { }
}