常量接口 vs 常量类 vs 枚举区别

简介: 把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?

把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?


那个更合理?


常量接口

public interface ConstInterfaceA {
    public static final String CONST_A = "aa";
    public static final String CONST_C = "cc";
}


存在问题:

  1. 无法限制开发人员, 继承/实现接口
  2. 开发人员能够在子接口里继续添加常量,而这些常量可能得不到祖先层的支持
  3. 常量作为参数时, 是 String, int 等弱类型, 开发人员可以传入没有在常量接口里定义的值, 这个问题无法通过编译器发现
  4. 由于开发人员可以直接写常量值, 所以不能用 == 对比, 只能用 equals 对比, 不能优化性能
  5. 开发人员在没有参考资料时, 不可能知道某个 int 型的参数到底应该赋什么内容
  6. 编译时, 是直接把常量的值编译到类的二进制代码里, 常量的值在升级中变化后, 需要重新编译所有引用常量的类, 因为里面存的是旧值


常量类

public class ConstClassA {
    public static final String CONST_A = "aa";
    public static final String CONST_C = "cc";
    private ConstClassA() {
    }
}


  • 常量类可以设置构造函数为 private
  • 从而限制继承, 也就没有继续添加常量的问题了
  • 但是其他问题与常量接口一样无法解决


枚举常量类

public class EnumClassA {
    private String name;
    private EnumClassA(String name) {
       this.name = name;
    }
    public static final EnumClassA CONST_A = new EnumClassA("aa");
    public static final EnumClassA CONST_C = new EnumClassA("cc");
}


解决了以上所有问题, 主要体现在:

  1. 私有构造函数, 避免被继承和扩展
  2. 定义方法的参数时, 必须用枚举常量类类型, 如上面的 EnumClassA 类型, 这样就转变成了强类型, 不会出现弱类型引起的问题
  3. 常量值地址唯一, 可以用 == 直接对比, 性能会有提高
  4. 开发人员可以根据该参数类型打开对应的类, 从而找到定义的常量
  5. 编译时, 没有把常量值编译到代码里, 即使常量的值发生变化也不会影响引用常量的类


enum 类型

public static enum Grade {
    A(4),
    B(3),
    C(2),
    D(1),
    F(0);
    private int points;
    Grade(int points) {
       this.points = points;
    }
    int getPoints() {
      return points;
    }
};


  • 这是 JDK 1.5 引入的, 其实就是枚举常量类的代码封装简化而已
  • 查看 enum 反编译后的代码与枚举常量类的结构非常相似
  • 这可能是因为 java 的设计者一开始觉得 enum 与 OO 思想不符
  • 所以没有提供支持, 但是随着常量接口的滥用和枚举常量类方案的出现
  • 才在 JDK 1.5 里增加了 enum
目录
相关文章
|
6月前
|
存储 开发者
如何确定常量的类型
在编程中,常量是程序中值不会改变的量。确定常量的类型是非常重要的,因为它直接影响了程序的效率和可读性。选择正确的常量类型可以确保程序占用更少的内存,运行更快,并且更容易理解和维护。
64 2
|
6月前
|
C语言
|
存储
3.2.6 怎样确定常量的类型
3.2.6 怎样确定常量的类型
46 0
|
6月前
|
存储 算法 C++
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
38 0
|
存储 编译器 Linux
关于枚举常量手误带来的错误
关于枚举常量手误带来的错误
105 0
|
Java 编译器 数据库
Java维护常量方式的比较——接口、常量类与枚举
Java维护常量方式的比较——接口、常量类与枚举 一、示例 ​ 1.让类实现定义了常量的接口
枚举常量及其应用
枚举常量及其应用
115 0
|
安全 Java 编译器
枚举使用、转数组、实现接口、枚举单例
枚举使用、转数组、实现接口、枚举单例
123 0
|
C++
C++常量定义的两种方式
# C++常量 作用:用于记录程序中不可更改的数据 C++常量定义的两种方式 1.#define 宏常量:#define 常量名 常量值 ​ 通常在文件上方定义,表示一个常量 2. const修饰的变量:const 数据类型 常量名 = 常量值 ​ 通常在变量定义前加关键字const,修饰该变量为常量,不可修改 示例:
218 0
|
安全 程序员
枚举代替常量
枚举代替常量
1145 1
枚举代替常量