大多数时候,我在同一个类中定义常量,我想使用它们。
但现在我必须在一个单独的类中定义所有常见常量。我看过两个定义类的常量版本:
一个。如果您尝试创建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 他们为什么使用第二版?
我应该使用哪一个,为什么要使用第二个版本?
答案 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, ..
}