为常量创建接口

时间:2012-10-30 10:25:12

标签: java

  

可能重复:
  Interfaces with static fields in java for sharing ‘constants’

我们需要在很多课程和我的问题中使用常量 是最佳实践创建具有公共属性的接口 或其他什么......

public static final String NAME = "Name";

谢谢!

4 个答案:

答案 0 :(得分:7)

您应该为此使用不可实现的类,而不是接口。

public final class Constants{

  private Constants(){}

  public static final String NAME = "Name";

  // more constants


}
根据Joshua Bloch在Effective Java中的说法,接口应该只定义行为:

  

常量接口模式是接口使用不佳。那个   class在内部使用一些常量是一个实现细节。   实现常量接口会导致此实现细节   泄漏到类的导出API中。它并不重要   类实现常量接口的类的用户。在   事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果   在将来的版本中,类被修改,以便它不再需要   要使用常量,它仍然必须实现接口   确保二进制兼容性如果非最终类实现常量   接口,它的所有子类都会污染它们的名称空间   通过界面中的常量。

来源:Effective Java,第19项:仅使用接口来定义类型

答案 1 :(得分:1)

我的建议是为常量创建一个类。不是接口,如果接口没有方法,那么它就不能满足它的用途。

  

在界面中放置常量是一种流行的技术   Java的日子,但现在许多人认为这是令人厌恶的用法   接口,因为接口应该处理由提供的服务   一个对象,而不是它的数据。同样,一个类使用的常量是   通常是一个实现细节,但将它们放在一个接口中   将他们推广到班级的公共API。

看看here

答案 2 :(得分:0)

您应该避免在界面中使用此类常量。你可以选择Sean Patrick Floyd提出的解决方案。或者为常量使用枚举类型。

public enum Constants {
 NAME("Name");

 private final String constant; 

 private Constats(String constat) {
   this.constant = constant;
 }

 public String constant(){ 
   return this.constat; 
 }

}

当您的代码需要它们时,您应该使用枚举类型。然后您将在代码中订购。

答案 3 :(得分:0)

- 首先一口气回答你的问题......是的可能,事实上,如果你使用

public int x=5;

int x=5

这将始终被解释为 public static final int x=5;

- 但这是不正确的方式

- 您可以更好地使用EnumClass with Private Constructor来处理此问题。

<强>例如

具有静态字段的类:

   public class Test{


       public final String NAME = "Name";

       private Test(){}


      }

}