`

常量接口 vs 枚举常量类

阅读更多
把常量定义在接口里与类里都能通过编译,那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


分享到:
评论

相关推荐

    使用类常量方式实现PHP枚举

    - **枚举的遍历**:无法直接遍历枚举类的所有常量,需要手动列出或使用反射类获取。 ### 5. PHP 8.1及以后的枚举支持 自PHP 8.1开始,PHP原生支持了枚举类型,提供了更好的类型安全和语言集成。例如: ```php ...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    这个方法返回一个包含所有枚举常量的数组。 ```java Color[] colors = colorClass.getEnumConstants(); for (Color color : colors) { System.out.println(color); } ``` 3. **获取枚举实例名**:每个枚举实例都...

    易语言C枚举常量转换

    在易语言中,有时我们需要与使用其他编程语言(如C)编写的代码进行交互,这就涉及到不同语言间的数据类型转换,特别是枚举常量的转换。 枚举(Enumeration)是C语言中的一种复合数据类型,它允许我们定义一组具有...

    JDK5.0新特性 常量 、枚举、 for each、反射

    本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让我们来看看“常量”。在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正...

    C枚举常量转换易语言源码

    在这个主题中,我们将关注的是C语言中的枚举和如何将C语言中的枚举常量转换为易语言(Easy Language)的源码。 C语言中的枚举常量: 在C语言中,枚举常量是通过`enum`关键字定义的。例如: ```c enum Color { RED,...

    enum枚举类的应用

    包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season {  SPRING, SUMMER, AUTUMN, WINTER  }  定义了一个季节枚举类型。  在本例中,对于Season.SPRING这个...

    Excel VBA 枚举 常量列表对应的数字

    枚举常量列表对应着不同的数值,这些数值在程序中用于执行特定操作或表示特定状态。以下是一些Excel VBA中的常用枚举常量及其对应的数字: 1. **日期和时间相关的枚举**: - `xl24HourClock`:值为33,表示24小时...

    56个民族枚举类

    通常,这样的枚举类可能会包含每个民族的枚举常量,可能还会包括一些方法来获取每个民族的英文名称或其他属性。例如: ```java public enum Nationality { HAN("汉族", "Han"), MAN("满族", "Manchu"), ZHANG(...

    枚举(switch、覆盖枚举、实现接口等)

    使用枚举可以提高代码的可读性,例如在交通灯的控制中,`TrafficLight`类的`change()`方法通过`switch`语句根据当前颜色改变信号。 3. 向枚举中添加方法: 枚举类型允许添加自定义方法。在上述例子中,`Color`枚举...

    举例说明易语言中枚举常量的使用方法

    在易语言中,枚举常量(Enum Constants)是一种非常实用的编程工具,它允许程序员为整数值赋予有意义的名称,提高代码可读性和可维护性。枚举常量本质上是整数,但它们提供了更直观的标识,使得在编写程序时能够更...

    C枚举常量转换.rar

    本资源“C枚举常量转换.rar”可能包含了一个易语言(EasyLanguage)的源码示例,用于展示如何在C中进行枚举常量的转换。 在C语言中,枚举的定义如下: ```c enum Color { Red, Green, Blue }; ``` 在这个例子中,`...

    实例181 - 遍历枚举接口的元素

    在策略模式中,每种枚举常量代表一种策略,遍历这些枚举可以让我们动态地选择和切换策略。 总的来说,理解和熟练掌握枚举接口的遍历对于编写高质量的Java代码至关重要。通过枚举接口,我们可以实现更安全、可维护的...

    java枚举类用法

    6. **枚举常量遍历** 可以通过`values()`方法获取枚举类型的全部实例,并进行遍历: ```java for (Color color : Color.values()) { System.out.println(color); } ``` 7. **枚举常量比较** 枚举实例之间...

    enum枚举类的一些代码demo

    枚举类的定义通常以关键字`enum`开头,后跟枚举名,然后是大括号`{}`内的一系列枚举常量。例如,我们可以定义一个表示一周七天的枚举: ```java public enum WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...

    java枚举实例代码

    虽然枚举不能作为其他类的父类,但它们默认继承了 `java.lang.Enum` 类,这意味着枚举实例可以使用 `Comparable` 和 `Serializable` 接口的方法。 此外,枚举可以实现接口,这使得它们可以具有自定义的行为。例如:...

    502.500.JAVA基础教程_枚举类与注解-使用enum关键字定义的枚举类实现接口(502).rar

    在这个例子中,`ShapeEnum`实现了`Shape`接口,每个枚举常量都提供了`draw()`方法的实现。这样,我们就可以根据枚举值来调用不同的`draw()`方法。 注解(Annotation)是Java中的另一个重要特性,它允许我们在代码中...

    Java手动方式创建枚举类示例

    Java手动方式创建枚举类是一种常见的编程方法,在Java中可以使用枚举类型来定义一组具有相同特征的常量。通过手动方式创建枚举类,可以更好地控制枚举类型的行为和特性。在本文中,我们将通过一个实例来介绍Java手动...

    SCJP 310-055 题库2 类、接口以及枚举

    ### SCJP 310-055 题库2:类、接口以及枚举 #### 题目解析与知识点总结 **题目1:接口中的成员变量** - **描述:** 给定一个接口 `Status`,其中包含一个成员变量 `MY_VALUE`,要求在第12行插入合适的修饰符。 ...

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    2. 枚举是一种特殊的类,因为被修饰为 final,所以不能继承其他类。 3. 枚举值本质上是静态常量,定义的枚举值会被默认修饰为 public static final。 4. 枚举提供了一些基本方法,如 values()、name()、ordinal()、...

Global site tag (gtag.js) - Google Analytics