0

这个问题一直困扰着我。我可以等待听到答复。我经常看到这个

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";

}
4

5 回答 5

11

我会说Enum。因为它们的唯一目的是表示一组固定的常数。

简单示例:

enum Season { WINTER, SPRING, SUMMER, FALL }
于 2012-11-29T15:40:01.920 回答
5

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

于 2012-11-29T15:40:20.250 回答
3

不要为此使用接口。一旦您有许多接口(可能来自扩展其他接口的接口),它就会变得非常混乱:然后您需要精确选择哪些接口来选择常量,这会抵消在接口中定义常量的好处。

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

public final static int DEFAULT_WIDTH = 666;
于 2012-11-29T15:45:45.037 回答
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;
    }

}
于 2012-11-29T15:55:56.193 回答
1

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

MyStuffs 示例中的枚举是有意义的,只要常量的名称对您有用。

这取决于谁将使用常量——有时在类内部使用常量是有意义的(避免使用魔法值)。在那种情况下“私有静态最终 * *;” 工作正常。

如果您希望常量作为 API 的一部分有用,那么请确保像 iStuff 中那样使用常量(顺便说一句,您可能会丢失“public static final”位,这是将它们像这样放在接口中时的默认设置)。

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

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

于 2012-11-29T15:48:58.177 回答