Java 关于接口和访问静态IMORT的替代方案

Java 关于接口和访问静态IMORT的替代方案,java,Java,我正在进行一项研究,在这项研究中,我不想将常量存储在接口本身中,所以我在寻找枚举之类的替代方法,但我发现的另一种方法是…t使用带有私有构造函数的最终类,而不是使用接口。(使类无法实例化或子类化,从而发送一条强烈的消息,表明它不包含非静态功能/数据。在这种情况下,我们还可以利用静态导入的优势。) Public final class KittenConstants { private KittenConstants() {} public static final String

我正在进行一项研究,在这项研究中,我不想将常量存储在接口本身中,所以我在寻找枚举之类的替代方法,但我发现的另一种方法是…t使用带有私有构造函数的最终类,而不是使用接口。(使类无法实例化或子类化,从而发送一条强烈的消息,表明它不包含非静态功能/数据。在这种情况下,我们还可以利用静态导入的优势。)

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);
    }