Java:将常量存储在非方法接口或类中更合适吗?

时间:2012-11-29 15:38:31

标签: java oop

这个问题一直困扰着我。我等着听到回复。我经常看到这个

public interface Istuff
{
    public static final int STATE_B = 4;
    public static final int STATE_L = 5;
    public static final int STATE_U = 6;
}

还有这个

public class MyStuffConstants
{
    public static final String STATUS = "STATUS";
    public static final String RUNNING = "RUNNING";

}

5 个答案:

答案 0 :(得分:11)

我会说Enum。因为他们唯一的目的是代表固定的常数。

简单示例:

enum Season { WINTER, SPRING, SUMMER, FALL }

答案 1 :(得分:5)

您应该使用enum。它太强大了,不使用它。

答案 2 :(得分:3)

不要使用接口。一旦你有许多接口(可能来自扩展其他接口的接口),它就会变得非常混乱:你需要精确地选择哪些接口来选择常量,从而消除了在接口中定义常量的好处。

干净的解决方案是为此设置一个非不稳定的类。当然,当枚举适用时(即,值在同一语义字段中是不同的可能值),您应该使用枚举。但是不要使用enum作为这种常量:

public final static int DEFAULT_WIDTH = 666;

答案 3 :(得分:2)

如果您还可以通过添加构造函数将任意数据与枚举常量相关联:

public enum Season {

    WINTER(1, 15), SPRING(2, 92), SUMMER(3, 40), FALL(50, 9);

    private final int foo;
    private final int bar;

    Season(int foo, int bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public int getFoo() {
        return foo;
    }

    public int getBar() {
        return bar;
    }

}

答案 4 :(得分:1)

对于IStuff示例,如果您实际上不需要整个排序位,我认为枚举有点笨拙 - 您最终基本上会创建一个包装整数的类。

只要常量名称适合您,MyStuffs示例就可以生成枚举。

归结为谁将使用常量 - 有时在类中内部使用常量是有意义的(避免使用魔术值)。在那种情况下,“private static final * *;”工作正常。

如果你希望常量作为API的一部分有用,那么确保在iStuff中执行常量(顺便说一句,你可以丢失“public static final”位,这在将它们放入接口时是默认的。)< / p>

编辑:如果您没有开头的接口,并且您有明确属于特定的常量,即使常量需要公开,我也不认为需要创建单独的接口只是为了有一个地方来放置常数。但是,如果常量将在两个或多个类/ apis中使用并且属于一个地方而不是另一个,那么确定为什么不将常量放在单独的接口中。

我认为常量的概念过于复杂,无法用一般的“做这个”陈述来回答。