这个问题一直困扰着我。我等着听到回复。我经常看到这个
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";
}
答案 0 :(得分:11)
答案 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中使用并且属于一个地方而不是另一个,那么确定为什么不将常量放在单独的接口中。
我认为常量的概念过于复杂,无法用一般的“做这个”陈述来回答。