在Java中实现常量的最佳方式是什么?

我见过这样的例子:

public class MaxSeconds {
   public static final int MAX_SECONDS = 25;
}

并假设我可以有一个Constants类来包装常量,并将它们声明为static final。 我几乎完全不知道Java,并且想知道这是否是创建常量的最佳方式。


这是完全可以接受的,甚至可能是标准。

(public/private) static final TYPE NAME = VALUE;

其中TYPE是类型, NAME是所有大写字母中带空格的下划线的名称, VALUE是常量值;

我强烈建议不要将常量放在自己的类或接口中。

作为一个方面说明:声明为final并且可变的变量仍然可以改变; 但是,变量永远不会指向不同的对象。

例如:

public static final Point ORIGIN = new Point(0,0);

public static void main(String[] args){

    ORIGIN.x = 3;

}

这是合法的, ORIGIN将成为( ORIGIN一个点。


我强烈建议不要有一个常量类。 当时似乎是一个好主意,但是当开发人员拒绝记录常量并且类增长到包含500个以上的常量(这些常量根本不相互关联)(与应用程序的完全不同方面有关)时,这通常变成常量文件,完全不可读。 代替:

  • 如果您有权访问Java 5+,请使用枚举为应用程序区域定义特定的常量。 应用领域的所有部分都应该针对这些常量引用枚举,而不是常量值。 你可以声明一个类似于你声明类的枚举。 枚举可能是Java 5+最有用的特性(也可能是唯一的)。
  • 如果你的常量只对某个特定的类或其某个子类有效,则将它们声明为protected或public,并将它们放在层次结构中的顶级类上。 这样,子类就可以访问这些常量值(如果其他类通过公共访问它们,常量不仅对特定的类有效......这意味着使用此常量的外部类可能与包含常量的类)
  • 如果你有一个定义了行为的接口,但是返回的值或者参数值应该是特定的,那么在接口上定义常量是完全可以接受的,以便其他的实现者可以访问它们。 但是,避免为了保持常量而创建一个接口:它可能会变得和为了保存常量而创建的类一样糟糕。

  • 使用接口来保存常量(由Josh Bloch命名为常量接口模式)是一个糟糕的做法。 以下是乔希建议的:

    如果常量与现有类或接口紧密相关,则应将它们添加到类或接口中。 例如,所有盒装数字基元类(如Integer和Double)都会导出MIN_VALUE和MAX_VALUE常量。 如果常量最好被视为枚举类型的成员,则应该使用枚举类型将它们导出。 否则,你应该使用一个不可用的实用程序类来导出常量。

    例:

    // Constant utility class
    package com.effectivejava.science;
    public class PhysicalConstants {
        private PhysicalConstants() { }  // Prevents instantiation
    
        public static final double AVOGADROS_NUMBER   = 6.02214199e23;
        public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
        public static final double ELECTRON_MASS      = 9.10938188e-31;
    }
    

    关于命名约定:

    按照惯例,这些字段的名称由大写字母组成,并用下划线分隔。 这些字段包含原始值或对不可变对象的引用至关重要。

    链接地址: http://www.djcxy.com/p/40899.html

    上一篇: What is the best way to implement constants in Java?

    下一篇: Dividing a string by type of data inside each line of file in python