应该将一组常量放在类或接口中吗?

Dav*_*ton 34 java standards coding-style

如果我有一组静态常量,我想集中声明这些静态常量,以便它们可以在各种项目中共享,如果它们放在类或接口(Java)中.

在过去,我已经看到它们主要放在一个类中,但我开始认为,因为类不会也不应该被实例化,也许它们在接口中会更好,但是接口不应该被任何类实现,例如

public class ErrorCodes {
    public static final String ERROR_1 = "-1";
    public static final String ERROR_2 = "-2";
}
Run Code Online (Sandbox Code Playgroud)

要么

public interface ErrorCodes {
    public static final String ERROR_1 = "-1";
    public static final String ERROR_2 = "-2";
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 32

如果他们有很强的联系,那么我会把它们放在枚举中:

public enum Error {
  ERROR_1("-1", "foo went wrong"),
  ERROR_2("-2", "bar went wrong");

  private final String id;
  private final String message;

  Error(String id, String message) {
    this.id=id;
    this.message=message;
  }

  public String getId() {
    return id;
  }

  public String getMessage() {
    return message;
  }
}
Run Code Online (Sandbox Code Playgroud)

优点是您可以在代码中使用类型安全性,并且可以轻松添加基于id的查找(通过HashMap<String,Error>在构造函数中构建a 或简单地循环values()).


And*_*ich 10

有些人认为常量接口是一种反模式(http://en.wikipedia.org/wiki/Constant_interface).

  • 在我看来,反模式是*实现*接口,以获得对命名常量的访问. (9认同)

Tom*_*han 6

你应该在课堂上做.

接口是类用户可以访问的可用方法,属性等的描述 - 通过实现接口,您可以保证在接口中声明的成员对用户可用.

另一方面,类是对象的描述或(如果你对OO原则不太苛刻......)静态成员的占位符.我个人发现在一些项目中将一堆常量存储在一个Settings类中是非常有用的,所以我不必在整个项目中查看定义.我认为这种方法也是你所追求的.


gus*_*afc 6

之前已经讨论:

您不希望接口中存在常量的原因是它诱使客户端类"实现"该接口(为了访问常量而不使用接口名称作为前缀).但是,您不应该 - 接口实际上不是对象功能的接口,而是在类外部类型中根深蒂固的编译时方便性.

有一段时间,"常量界面"非常方便,但它一直是"错误的",甚至懒惰也不是使用它现在我们有import static声明的借口.

编辑:虽然我必须同意,对于您的问题中提供的方案,枚举更合适.


Von*_*onC 5

这里应考虑使用静态导入(用于导入类中定义的常量)或类型安全的枚举.

来自常量的接口

在Java的早期,将常量​​放在接口中是一种流行的技术,但是现在许多人认为它是对接口的厌恶使用,因为接口应该处理对象提供的服务,而不是数据.
同样,类使用的常量通常是实现细节,但将它们放在接口中会将它们提升为类的公共API.