【问题标题】:Creating class for defining constants创建用于定义常量的类
【发布时间】:2011-05-04 06:39:16
【问题描述】:

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

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

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

final class Consts  {
        private Consts(){}

        public static final String TAG = "something";
    }

b.如果尝试创建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 为什么他们使用第二个版本?

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

【问题讨论】:

  • 你也可以创建一个enum

标签: java


【解决方案1】:

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

另一个常见的习惯是将常量持有者设为interface。然而,这并没有得到普遍认可,并且可能导致人们implement-ing 该接口,这通常被认为是代码异味。

【讨论】:

  • 检查这个类的android grepcode.com/file/repository.grepcode.com/java/ext/…在构造函数中抛出异常有什么好处。
  • 事情并不总是因为某种原因以某种方式制造出来的,有时这只是习惯。阻止这些类的实例化几乎无关紧要,任何人都可以随心所欲。 PS:我不喜欢界面技巧,我觉得它有点矫枉过正
  • 我不认为 android 示例是一个不错的示例。构造函数使客户(和代码的读者)感到困惑。它们应该是私有的(并且仍然可以抛出异常)。
【解决方案2】:

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

不过,还有其他选择,例如你可以让 Consts 成为一个接口

interface Consts {
  String TAG = "somthing"
}

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

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

enum Consts {
    TAG, OTHER, ..
}

【讨论】:

    【解决方案3】:

    你可以同时使用,第一个更简单更好,因为会导致“编译”错误,而不是运行时,即你之前发现了问题。

    您还可以在包中将类设为私有(不使用public 修饰符)并在包中编写其他类(如果始终是您编写它们),这样它们就不会实例化该类。是的,java 是 OOP,但你不需要学究气。 :) 我从未见过任何人错误地实例化一类静态字段,如果他/她这样做了,那也没有什么坏处。

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多