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,但如果您需要字符串常量,枚举无法提供它们。