关于接口的替代和使用静态导入的访问

时间:2012-08-21 03:55:56

标签: java

我正在进行一项研究,其中我不想将常量存储在界面本身,所以我一直在寻找像枚举这样的替代品,但我找到的另一种方法是......而不是使用界面,使用带有私有构造函数的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做同样的事情。!

2 个答案:

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

....这有点难看,我认为没有办法解决丑陋问题。

底线 - 枚举不是所有种常量的理想替代品。