Java常量定义的样式

3

样式 1

public interface Constants{
    String FOO = "foo",
           BAR = "bar",
           ... ;
}

STYLE 2

public interface Constants{
    String FOO = "foo";
    String BAR = "bar";
    ...
}

我曾经在单个接口中声明所有的常量。我遵循样式1,因为它更易读。我想知道除了可读性之外,这两种风格是否有任何区别。这两种风格是否存在与性能相关的问题?
注意:我从未实现过Constant接口,而是像Constants.FOO这样访问那些常量。
示例:
public class Main{

    public static void main(String[] args){

        ...
        System.out.println(Constants.FOO);
        ...

    }

}

哪个更好,为什么呢?

2
不要这样做。这是一种反模式。https://en.wikipedia.org/wiki/Constant_interface - karakfa
1
通常在类中使用枚举类型或“private final static”。 - Mihai8
1
通常不建议同时声明多个变量。第二个实际上更易读:我可以在变量行找到变量的类型,而不是在上面25行。编译后的字节码将是相同的。 - JB Nizet
4个回答

4

我使用样式1因为它更易读。

考虑以下情况,

 private static final String FOO1="foo1", FOO2="foo2", FOO3="foo3",BAR="bar"...//and so on

现在这篇文章的可读性不够好,请看下面的内容:

private static final String FOO1 ="foo1";
private static final String FOO2 ="foo2";
private static final String FOO3 ="foo3";//and so on

现在考虑上述代码的易读性,
constant FOO1 ="foo1";
constant FOO2 ="foo2";
constant FOO3 ="foo3";//and so on

and

constant FOO1 = "foo1",  FOO2 = "foo2", FOO3 = "foo3";

在阅读第二个例子时,您可能会错过一个重点,即 FOO3 也是常量,而在第一个例子中,任何人都可以清楚地看到 FOO3 是常量。此外,在这两种情况下,内存或执行方面没有区别。

如果您专门为常量创建interface,那么您没有使用Java中interface的目的。 Interface应该包含某些实现类必须同意的契约。仅用interface来包含常量是不好的。


2

它们在编译代码层面完全相同,没有任何区别。然而,尽量避免这样的模式。之前已经给出了几个答案,解释为什么不鼓励使用。

如果您不打算实现常量接口,那么将常量放置在一个final类中会更有意义。


在接口内部,每个字段都是隐式的 final 和 static。但是我同意它们本来就不应该出现在接口中。 - JB Nizet
我认为接口中的每个字段都自动是public static和final的,不是吗? - theapache64
我从未实现过那个接口,而是像 Constants.FOO 一样访问了那些常量。 - theapache64
@ShifarShifz那为什么不至少把它们放在一个类中,而不是接口?那枚举类型呢? - M A

2
你不应该在一个接口中定义常量,这是不好的实践。相反,应该在逻辑上合适的类中定义每个常量。
此外,这些常量应该是static final的。这样你只需要一个常量的实例,而不是在代码中到处定义新的常量,这会影响性能。
编辑:如评论中所述,接口常量在定义时就是static final的。然而,当它们被正确地定义在应该定义的地方时,值得注意这一点作为提醒。

1

首先,在自己的类中声明所有常量。不要将它们分组在单个接口中,这是一种糟糕的设计。

我想知道除了可读性之外,这两种风格有什么区别。

没有其他区别,只有可读性不同。

这两种风格是否涉及性能问题?

没有。相同。编译成相同的字节码。

哪种更好,为什么?

仅从可读性方面来看,第二种方式最好。再次强调,选择最适合您的最佳可读性方法。我更喜欢第二种。


但是,Suresh,这些常量在多个类中都被使用。而且我从未实现过该接口,而是直接调用 Constants.FOO。那么现在这是不好的实践吗? - theapache64
1
如果接口不打算被实现,为什么要将其设计为接口?把它设计成一个final类并加上私有构造函数即可让你的代码正常工作,而且不会有人试图去实现这个接口。另外,将不相关的常量放在同一个类中也是不好的做法,应该将常量放在它们所属的类中。例如,边框布局约束在BorderLayout中定义,整数的最大和最小值在Integer中定义。 - JB Nizet
1
当你看到Constants.FOO时,如果FOO是一个静态常量,那么Constants不一定是一个接口。 - Suresh Atta
@JBNizet 感谢您提供的宝贵信息,jb。 - theapache64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接