常量接口 vs 常量类 vs 枚举区别
把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?
那个更合理?
常量接口
public interface ConstInterfaceA {
public static final String CONST_A = "aa";
public static final String CONST_C = "cc";
}
存在问题:
- 无法限制开发人员, 继承/实现接口
- 开发人员能够在子接口里继续添加常量,而这些常量可能得不到祖先层的支持
- 常量作为参数时, 是 String, int 等弱类型, 开发人员可以传入没有在常量接口里定义的值, 这个问题无法通过编译器发现
- 由于开发人员可以直接写常量值, 所以不能用
==对比, 只能用equals对比, 不能优化性能 - 开发人员在没有参考资料时, 不可能知道某个 int 型的参数到底应该赋什么内容
- 编译时, 是直接把常量的值编译到类的二进制代码里, 常量的值在升级中变化后, 需要重新编译所有引用常量的类, 因为里面存的是旧值
常量类
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");
}
解决了以上所有问题, 主要体现在:
- 私有构造函数, 避免被继承和扩展
- 定义方法的参数时, 必须用枚举常量类类型, 如上面的
EnumClassA类型, 这样就转变成了强类型, 不会出现弱类型引起的问题 - 常量值地址唯一, 可以用
==直接对比, 性能会有提高 - 开发人员可以根据该参数类型打开对应的类, 从而找到定义的常量
- 编译时, 没有把常量值编译到代码里, 即使常量的值发生变化也不会影响引用常量的类
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
常量接口 vs 常量类 vs 枚举区别的更多相关文章
- Collection接口和Collections类的简单区别和讲解
这里仅仅进行一些简单的比较,如果你想要更加详细的信息话,请自己百度. 1.Collection: 是集合类的上层接口.本身是一个Interface,里面包含了一些集合的基本操作. Collection ...
- 关于java中接口定义常量和类定义常量的区别
/** * * @author YZJ * @Description java中定义常量的最佳方法 */ public final class Contants{ /** * @Description ...
- Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?
最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...
- PHP中的预定义常量、类常量和魔术常量的区别
PHP 向它运行的任何脚本提供了大量的预定义常量.不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 对于一些基本的常量是这些常量在 ...
- Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final
笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...
- 【C# 基础概念】静态常量和动态常量的区别
C# 静态常量和动态常量的区别 C#中有两种常量类型分别为readonly(运行时常量)与const(编译时常量),readonly是变量的常量,const是字面量的常量本文将就这两种类型的不同特性进 ...
- C#静态常量和动态常量的区别
C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime constants).它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误.相比之下 ...
- java中常量接口及实现常量接口的利与弊
在所做的项目中,将程序中很多要用的常量放置在ServiceConstants的接口中,称其为常量接口,只要实现该接口,就可以 在项目中直接使用常量接口中的常量,通过上网搜索之后,将很好的两篇博客链接储 ...
- C/C++文字常量与常变量的概念与区别 分类: C/C++ 2015-06-10 22:56 111人阅读 评论(0) 收藏
以下代码使用平台是Windows 64bits+VS2012. 在C/C++编程时,经常遇到以下几个概念:常量.文字常量.符号常量.字面常量.常变量.字符串常量和字符常量,网上博客资料也是千篇千律,不 ...
- c++类成员函数重载常量与非常量版本时避免代码重复的一种方法
c++有时候需要为类的某个成员函数重载常量与非常量的版本,定义常量版本是为了保证该函数可作用于常量类对象上,并防止函数改动对象内容.但有时两个版本的函数仅仅是在返回的类型不同,而在返回前做了大量相同的 ...
随机推荐
- 权限RBAC、RBAC0 、RBAC1、RBAC2
https://zhuanlan.zhihu.com/p/34608415 权限系统的基本构成 权限系统主要由三个要素构成:帐号,角色,权限. 帐号是登录系统的唯一身份识别,一个账号代表一个用户.由自 ...
- Java19新特性
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- stm32的学习笔记1
一 目录结构管理 Libraries是放官方固件库的 MDK-ARM是放产生的文件的,工程存放的目录 USERS是放自己写的代码的 然后是一个解释文件README 在MDK-ARM目录里还要创建两个文 ...
- modbus_new_rtu
/** * modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit); * 这个函数会 ...
- 升级:In-Place Upgrade升级MySQL5.6.26
升级需谨慎,事前先备份 MySQL升级的实质是对数据字典的升级,数据字典有:sys.mysql.information_schema.performance_schema . MySQL升级的两种方式 ...
- IDA 特征码生成和搜索脚本
最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言. 一共就是实现了两个函数,一个用于搜索特征码 (SearchPattern),一个用于生成特征码 (GenerateF ...
- php7的一些新特性
php7的一些特性 打破一切 PHP7要打破一切. PHP开发人员应该接受打破版本之间向下兼容的定律.只要不允许大量的向后兼容,PHP7将是一个高度尊重的语言. 1.创建一个具体的核心语言 删除所有库 ...
- openwrt开发使用-arping
前言 IP冲突引起的网络异常,可以通过检查IP是否冲突,排除故障.我们可以用一些工具进行检查,例如arp-scan.arping软件进行查看. 这里使用arping进行检查设备的MAC地址,通过查查看 ...
- 链式描述线性表(C++实现)
在链式描述中,线性表的元素在内存中的存储位置是随机的,每个元素都有一个明确的指针或链指向下一个元素的位置 chain类 在此使用单向链表实现了线性表,其中最后一个节点的指针域为NULL,即它用单向链接 ...
- Network Science: 巴拉巴西网络科学阅读笔记
前言: 最小生成树中Kruskal算法对应了统计物理中的著名模型invasion percolation.由此写了一篇文章:invasion percolation and global optimi ...