如何在Java中实现常量

时间:2012-01-10 20:05:58

标签: java constants

这是一个好主意,在Constants类容器中的类中对常量进行分组,如

public final class Constants {
  public final class File {
    public static final int MIN_ROWS = 1;
    public static final int MAX_ROWS = 1000;

    private File() {}
  }

  public final class DB {
    public static final String name = "oups";

    public final class Connection() {
      public static final String URL = "jdbc:tra-ta-ta";
      public static final String USER = "testUser";
      public static final String PASSWORD = "testPassword";

      private Connection() {}
    }

    private DB() {}
  }

  private Constants() {}
}

允许使用Constants.DB.Connection.URL代替DbConnectionConstants.URL

5 个答案:

答案 0 :(得分:9)

我通常更喜欢将常量放在它们所属的类中。例如,文件常量可以在FileManager(或类似的东西)中使用它们。连接常量可以在DBUtil类中,使用它们。

想想JDK。它有一个巨大的常量类吗?不是。{和BorderLayout使用的常量在类BorderLayout中。 (和JOptionPane使用的常量位于JOptionPane

答案 1 :(得分:2)

优点:

  1. 你得到了一个很好的“路径”。
  2. 如果同事遵循指南,您可能会获得跨代码常量约定。
  3. 缺点:

    1. 对于许多常量和常量的许多“域”,该类可能过于繁琐而无法处理。
    2. 这不直观。它让我想起了比java常量更多的Ant属性。
    3. 它可以防止代码的模块化。假设您要将数据库连接包和文件处理包分离到不同应用程序可能使用的不同jar。使用文件处理常量交付数据库管理jar是多余的。你可以很容易地拥有许多这样的模块。
    4. 总之,当你为自己编写一些小应用程序时,它可能会很方便。一般来说,这不是一个好习惯。

答案 2 :(得分:1)

使用枚举http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

每个JVM只有一个枚举对象副本

答案 3 :(得分:1)

您始终可以使用foo.bar.baz表示法在类路径中使用.properties文件。这样可以更轻松地更改值而无需重新编译。 Spring框架提供了实用程序来帮助动态刷新值。

但是,我同意 @JB Nizet @yair ,与最常关联的类保持一致是一个更好的主意。

答案 4 :(得分:-3)

您也可以将abstract用于常量类,甚至比私有构造函数更好。如果使用接口,它可以在类层次结构之外使用,并且可以使用implements但是隐藏原点(接口名称)。

但有一个问题。如果仅为常量导入类,编译器可能会删除.class中的导入并填充常量本身。如果稍后更改常量的值,则using类将不会自动重新编译,并保持旧值。