创建用于定义常量的类

时间:2011-05-04 06:39:16

标签: java

大多数时候,我在同一个类中定义常量,我想使用它们。

但现在我必须在一个单独的类中定义所有常见常量。我看过两个定义类的常量版本:

一个。如果您尝试创建Consts的对象,则会产生编译时错误。

final class Consts  {
        private Consts(){}

        public static final String TAG = "something";
    }

湾如果您尝试创建Consts的对象。

,则会抛出运行时异常
 final class Consts  {
        public Consts(){
            throw new RuntimeException();
        }

        public static final String TAG = "something";
    }

检查这类android http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/Manifest.java 他们为什么使用第二版?

我应该使用哪一个,为什么要使用第二个版本?

3 个答案:

答案 0 :(得分:3)

我没有看到第二个版本的任何原因,因为第一个版本(private构造函数)完全符合您的要求。

另一个常见的目标是使常数持有者成为interface。但是,这并没有得到普遍认可,并且可能会导致人们implement这个界面,这通常被认为是代码气味。

答案 1 :(得分:1)

你可以使用两者,首先是更简单和更好,因为导致'编译'错误,而不是运行时,即你之前遇到问题。

你也可以在包中使用private(不使用public修饰符)并在包中写入其他类(如果它总是你编写它们),这样它们就不会实例化那个类。是的,java是OOP,但你不需要迂腐。 :)我从来没有见过任何人错误地实例化一类静态字段,如果他/她这样做,那么它不会造成任何伤害。

答案 2 :(得分:1)

从我的观点来看,没有理由使用第二种方法。它在API中具有误导性,因为该类公开了一个可见的构造函数,在任何情况下都会抛出异常。客户可能陷入陷阱。

但是,还有其他选择,例如你可以使Consts成为一个界面

interface Consts {
  String TAG = "somthing"
}

这将允许实现接口的类,从而“更容易”访问常量(没有静态导入)。另一个优点是,即使您只在IDE中编译了类,也可以使用查找引用。由于编译器会将常量内联到using类中,因此很难找到对TAG的引用。如果客户端实现该接口,则可以轻松查找它们。但是,一些编码指南禁止这样做。

可能的下一个选项是枚举。 JVM将确保枚举类中每个常量只有一个实例:

enum Consts {
    TAG, OTHER, ..
}