我正在进行一项研究,其中我不想将常量存储在界面本身,所以我一直在寻找像枚举这样的替代品,但我找到的另一种方法是......而不是使用界面,使用带有私有构造函数的final类。 (使得无法对类进行实例化或子类化,发送一条强大的消息,表明它不包含非静态功能/数据。在这种情况下我们也可以利用静态导入
Public final class KittenConstants
{
private KittenConstants() {}
public static final String KITTEN_SOUND = "meow";
public static final double KITTEN_CUTENESS_FACTOR = 1;
}
两个独立的事情。 1:使用静态导入而不是滥用继承。 2:如果必须有常量存储库,请将其设为最终类而不是接口。请指教这种方法是否正确.. !!
为了避免常量接口的一些缺陷(因为你不能阻止人们实现它),应该首选一个带私有构造函数的正确类(例如从维基百科借来的):
public final class Constants {
private Constants() {
// restrict instantiation
}
public static final double PI = 3.14159;
public static final double PLANCK_CONSTANT = 6.62606896e-34;
}
要访问常量而不必完全限定它们(即不必使用类名称作为前缀),请使用静态导入(自Java 5开始):
import static Constants.PLANCK_CONSTANT;
import static Constants.PI;
public class Calculations {
public double getReducedPlanckConstant() {
return PLANCK_CONSTANT / (2 * PI);
}
}
请说明我们如何与enum做同样的事情。!
答案 0 :(得分:2)
您可以通过枚举实现“常量”:
public enum Animal {
Kitten("meow", 1),
Puppy("woof", 2);
private final String sound;
private final double cuteness;
Animal (String sound, double cuteness) {
this.sound = sound;
this.cuteness = cuteness;
}
public String getSound() {
return sound;
}
public double getCuteness() {
return cuteness;
}
}
使用:
String sound = Animal.Kitten.getSound();
double cuteness = Animal.Kitten.getCuteness();
答案 1 :(得分:1)
简单的答案是你不能用enum
做到这一点。枚举定义了一组具有相同类型的相关常量 。
KittenConstants
案例中的内容是一组具有根本不同类型的常量。这不适合enum
模型。 (如果你稍微改变一下问题;例如通过推广不同类型的SFA,你可以使它适合......正如@Bohemian所做的那样......但如果这不是你想要实现的,enum
是不是正确的解决方案。)
Constants
案例中的内容是一堆您想要用作值的命名浮点常量。 (所有相同类型......有帮助!)现在您可以将它们声明为enum
,如下所示:
public enum Constants {
PLANCK_CONSTANT(6.62606896e-34),
PI(3.14.59);
public final double value;
Constants(double value) {this.value = value);
}
障碍是您需要使用“.value”来访问每个命名常量的数值; e.g。
import static Constants.*;
....
public double getReducedPlanckConstant() {
return PLANCK_CONSTANT.value / (2 * PI.value);
}
....这有点难看,我认为没有办法解决丑陋问题。
底线 - 枚举不是所有种常量的理想替代品。