把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?那个更合理?
1. 常量接口
- public interface ConstInterfaceA {
- public static final String CONST_A = "aa";
- public static final String CONST_C = "ac";
- }
存在问题:
1) 无法限制开发员继承/实现接口.
2) 开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持.
3) 常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现.
4) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能
5) 开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容.
6) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值.
2. 常量类
- public class ConstClassA {
- public static final String CONST_A = "aa";
- public static final String CONST_C = "ac";
- private ConstClassA() {
- }
- }
常量类可以设置构造函数为private,从而限制继承,也就没有继续添加常量的问题了.
但是其他问题与常量接口一样无法解决
3. 枚举常量类
- 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("ac");
- }
解决了以上所有问题,主要体现在:
1) 私有构造函数,避免被继承和扩展.
2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引起的问题.
3) 常量值地址唯一,可以用==直接对比,性能会有提高.
4) 开发员可以根据该参数类型打开对应的类,从而找到定义的常量.
5) 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类.
4. 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;
- }
- };
这是JDK1.5引入的,其实就是枚举常量类的代码封装简化而已.
查看enum反编译后的代码与枚举常量类的结构非常相似.
这可能是因为java的设计者一开始觉得enum与OO思想不符,所以没有提供支持,但是随着常量接口的滥用和枚举常量类方案的出现,才在JDK1.5里增加了enum.
原文地址:http://blog.csdn.net/jxc/archive/2009/03/18/4001397.aspx
相关推荐
在易语言中,有时我们需要与使用其他编程语言(如C)编写的代码进行交互,这就涉及到不同语言间的数据类型转换,特别是枚举常量的转换。 枚举(Enumeration)是C语言中的一种复合数据类型,它允许我们定义一组具有...
在编程领域,枚举(Enumeration)是一种特殊的数据类型,它定义了一组命名的常量,这些常量在程序中代表特定的值。枚举在不同的编程语言中有着不同的实现方式和使用规则。在这个主题中,我们将关注的是C语言中的枚举...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...
- **枚举的遍历**:无法直接遍历枚举类的所有常量,需要手动列出或使用反射类获取。 ### 5. PHP 8.1及以后的枚举支持 自PHP 8.1开始,PHP原生支持了枚举类型,提供了更好的类型安全和语言集成。例如: ```php ...
Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方 enum Season { SPRING, SUMMER, AUTUMN, WINTER } 定义了一个季节枚举类型。 在本例中,对于Season.SPRING这个...
枚举常量列表对应着不同的数值,这些数值在程序中用于执行特定操作或表示特定状态。以下是一些Excel VBA中的常用枚举常量及其对应的数字: 1. **日期和时间相关的枚举**: - `xl24HourClock`:值为33,表示24小时...
在C编程语言中,枚举(enumeration)是一种特殊的类型定义,它允许程序员定义一组具有特定名字的整型常量。这些名字代表了特定的数值,通常用于简化代码的可读性和可维护性。枚举常量转换是编程中常见的一种操作,...
包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。
通常,这样的枚举类可能会包含每个民族的枚举常量,可能还会包括一些方法来获取每个民族的英文名称或其他属性。例如: ```java public enum Nationality { HAN("汉族", "Han"), MAN("满族", "Manchu"), ZHANG(...
然而,可以通过其他方式来实现类似枚举的功能,例如定义常量或使用类。 这个压缩包文件可能包含了一个程序或者代码示例,演示了如何将C语言中的枚举常量转换为易语言可以理解和使用的格式。转换过程可能包括读取...
枚举常量与普通常量的主要区别在于,普通常量通常用`#`开头,如`#MAX_SIZE`,而枚举常量则是`#枚举类型.常量名`的形式,如`#颜色.红色`。枚举常量属于特定的枚举类型,而普通常量没有这种类型限制。 4. 应用场景...
- 转换接口:对外提供的函数或子程序,供其他易语言代码调用来进行枚举常量的转换。 学习并理解这个源码,不仅可以帮助你理解C语言枚举和易语言常量之间的转换原理,还能提升你在易语言中处理跨语言交互问题的能力...
本压缩包"易语言源码C枚举常量转换易语言源码.rar"是关于在易语言中处理C语言枚举常量转换的实践代码资源。 在C语言中,枚举(enum)是一种定义常量集合的数据类型,它允许用户创建一组相关的整数值。枚举常量通常...
易语言C枚举常量转换易语言源码.rar 易语言C枚举常量转换易语言源码.rar 易语言C枚举常量转换易语言源码.rar 易语言C枚举常量转换易语言源码.rar 易语言C枚举常量转换易语言源码.rar 易语言C枚举常量转换易语言...
在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量。枚举接口(Enum Set)是Java提供的一种高效、简洁的方式来处理枚举类型集合。本实例“实例181 - 遍历枚举接口的元素”主要探讨如何遍历和...
通过以上内容,我们可以看出Java的`enum`枚举类不仅限于简单的常量集合,它还支持丰富的特性,如方法、接口、构造函数等,使得枚举成为编写简洁、安全、可维护代码的重要工具。在实际编程中,我们应该根据需求灵活...
本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让我们来看看“常量”。在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正...
枚举在Java编程语言中是一种强大的工具,它允许开发者定义一组相关的常量,并且提供了许多超越普通常量的功能。在JDK 1.5引入枚举类型后,它成为了一种更加灵活和可读的代码表示方式。以下将详细介绍枚举的几个主要...
Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...