Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为常量创建接口_Java - Fatal编程技术网

Java 为常量创建接口

Java 为常量创建接口,java,Java,可能重复: 我们有常数,我们需要在很多课堂和我的问题中使用 它的最佳实践是创建具有公共属性的接口 或者别的什么 public static final String NAME = "Name"; 谢谢 您应该为此使用不可实例化的类,而不是接口 public final class Constants{ private Constants(){} public static final String NAME = "Name"; // more constants }

可能重复:

我们有常数,我们需要在很多课堂和我的问题中使用 它的最佳实践是创建具有公共属性的接口 或者别的什么

public static final String NAME = "Name";

谢谢

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

public final class Constants{

  private Constants(){}

  public static final String NAME = "Name";

  // more constants


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

恒定接口模式是对接口的不当使用。即 类在内部使用一些常量是一个实现细节。 实现常量接口会导致此实现详细信息 泄漏到类的导出API中。这对公众没有影响 类实现常量接口的类的用户。在里面 事实上,这甚至可能让他们感到困惑。更糟糕的是,它代表了一种承诺:如果 在将来的版本中,该类将被修改,以便不再需要 要使用constants,它仍然必须实现 确保二进制兼容性。如果非最终类实现了常量 接口,其所有子类的名称空间都将被污染 通过接口中的常量

public final class Constants{

  private Constants(){}

  public static final String NAME = "Name";

  // more constants


}

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

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

在早期,在接口中放置常量是一种流行的技术 java时代,但现在很多人认为它是一种令人厌恶的用法。 接口,因为接口应该处理 一个对象,而不是它的数据。同样,类使用的常量是 通常是实现细节,但将它们放置在接口中 将它们升级到类的公共API


看看。

您应该避免在接口中使用此类常量。你可以采用肖恩·帕特里克·弗洛伊德提出的解决方案。或者对常量使用枚举类型

public enum Constants {
 NAME("Name");

 private final String constant; 

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

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

}

当代码需要它们时,应该使用枚举类型。然后您将在代码中获得顺序

-首先,一口气回答你的问题……是的,这是可能的,如果你使用

public int x=5

int x=5

这将始终被解释为
公共静态最终int x=5

-但这不是正确的方法

-您可以更好地使用
Enum
或带有私有构造函数的
类来处理此问题

例如:

   public class Test{


       public final String NAME = "Name";

       private Test(){}


      }

}
带有静态字段的类:

   public class Test{


       public final String NAME = "Name";

       private Test(){}


      }

}

我同意enum解决方案,但不幸的是,enum的成员不是编译时常量,例如,它不能用于注释值。不幸的是,没有编译时常量从枚举中获取字符串的方法,您是对的。很高兴你能指出这一点。我写这篇文章是因为OP或其他开发人员可能不需要编译时常量,而只需要一个地方,在那里他可以将占位符存储到代码中重新使用的字符串值中。不需要实例化一个只包含常量的类。@SeanPatrickFloyd您完全正确,但是我想说明一下,
“一个具有静态方法和静态字段的类相当于Sigleton类”,但是这不应该被使用,因为JVM加载哪个类以及何时加载不是一个确定的过程。所以单身是一个安全的赌注。
安全但多余。你的单子甚至不包含常量字段,所以它完全没有意义。另外:这是一个很好的实践,使单身班final@SeanPatrickFloyd我想你错过了我代码中的常量字段名。。。求你了properly@SeanPatrickFloyd此外,如果你再仔细阅读一遍,你就会知道我还建议使用枚举。。。但提供了单身的例子…谢谢你的回答!您认为对常量使用final类比使用enum好吗?谢谢大家!@如果您可以使用枚举,则最好使用FedorE,但如果您需要字符串常量,枚举无法提供它们。