Java 关于接口和访问静态IMORT的替代方案
我正在进行一项研究,在这项研究中,我不想将常量存储在接口本身中,所以我在寻找枚举之类的替代方法,但我发现的另一种方法是…t使用带有私有构造函数的最终类,而不是使用接口。(使类无法实例化或子类化,从而发送一条强烈的消息,表明它不包含非静态功能/数据。在这种情况下,我们还可以利用静态导入的优势。)Java 关于接口和访问静态IMORT的替代方案,java,Java,我正在进行一项研究,在这项研究中,我不想将常量存储在接口本身中,所以我在寻找枚举之类的替代方法,但我发现的另一种方法是…t使用带有私有构造函数的最终类,而不是使用接口。(使类无法实例化或子类化,从而发送一条强烈的消息,表明它不包含非静态功能/数据。在这种情况下,我们还可以利用静态导入的优势。) Public final class KittenConstants { private KittenConstants() {} public static final String
Public final class KittenConstants
{
private KittenConstants() {}
public static final String KITTEN_SOUND = "meow";
public static final double KITTEN_CUTENESS_FACTOR = 1;
}
两件独立的事情。1:使用静态导入,而不是滥用继承。2:如果您必须拥有常量存储库,请将其作为最终类而不是接口。请告知此方法是否正确
为了避免常量接口的一些缺陷(因为您无法阻止人们实现它),最好使用带有私有构造函数的适当类(示例借用自Wikipedia):
要访问常量而不必完全限定它们(即不必在它们前面加上类名),请使用静态导入(自Java 5以来):
请说明我们如何使用枚举进行相同的处理。您可以通过枚举实现“常量”:
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();
简单的答案是,不能使用
枚举
。枚举定义了一组具有相同类型的相关常量
在KittenConstants
案例中,有一组类型根本不同的常量。这不适合enum
模型。(如果您稍微改变一下问题;例如,通过对不同类型的SFA进行归纳,您可以使其适合……正如@Bohemian所做的……但如果这不是您试图实现的目标,enum
不是正确的解决方案。)
在常量
案例中,您有一组要用作值的命名浮点常量。(所有类型都相同…这很有帮助!)现在您可以将它们声明为枚举
,如下所示:
public enum Constants {
PLANCK_CONSTANT(6.62606896e-34),
PI(3.14.59);
public final double value;
Constants(double value) {this.value = value);
}
问题是您需要使用“.value”来访问每个命名常量的数值;例如
import static Constants.*;
....
public double getReducedPlanckConstant() {
return PLANCK_CONSTANT.value / (2 * PI.value);
}
……这有点难看,我不认为有任何办法可以避免这种难看
底线-枚举不是所有常数的理想替代品。不使用枚举的原因是什么?@Jon Lin..dude你能将我的第二个示例转换为枚举,并展示类如何访问枚举的常数,这将对理解有很大帮助..@w4rumy你能将我的第二个示例转换为enu吗并展示该类如何访问enum的常量,这将对understand@Crazy4Java有关如何在枚举中执行此操作,请参见我的答案
public enum Constants {
PLANCK_CONSTANT(6.62606896e-34),
PI(3.14.59);
public final double value;
Constants(double value) {this.value = value);
}
import static Constants.*;
....
public double getReducedPlanckConstant() {
return PLANCK_CONSTANT.value / (2 * PI.value);
}