`
2277259257
  • 浏览: 517984 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多

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

1. 常量接口 

Java代码  收藏代码
  1. public interface ConstInterfaceA {  
  2.   public static final String CONST_A = "aa";  
  3.   public static final String CONST_C = "ac";  
  4. }  



存在问题: 

1) 无法限制开发员继承/实现接口. 

2) 开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持. 

3) 常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现. 

4) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能 

5) 开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容. 

6) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值. 


2. 常量类 

Java代码  收藏代码
  1. public class ConstClassA {  
  2.   public static final String CONST_A = "aa";  
  3.   public static final String CONST_C = "ac";  
  4.   
  5.   private ConstClassA() {  
  6.   }  
  7. }  



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


3. 枚举常量类 

Java代码  收藏代码
  1. public class EnumClassA {  
  2.   private String name;  
  3.   
  4.   private EnumClassA(String name) {  
  5.     this.name = name;  
  6.   }  
  7.   
  8.   public static final EnumClassA CONST_A = new EnumClassA("aa");  
  9.   public static final EnumClassA CONST_C = new EnumClassA("ac");  
  10. }  



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

1) 私有构造函数,避免被继承和扩展. 

2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引起的问题. 

3) 常量值地址唯一,可以用==直接对比,性能会有提高. 

4) 开发员可以根据该参数类型打开对应的类,从而找到定义的常量. 

5) 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类. 


4. enum类型 

Java代码  收藏代码
  1. public static enum Grade {  
  2.                             A(4),  
  3.                             B(3),  
  4.                             C(2),  
  5.                             D(1),  
  6.                             F(0);  
  7.                               
  8.                             private int points;  
  9.                             Grade(int points) {  
  10.                                 this.points = points;  
  11.                             }  
  12.                               
  13.                             int getPoints() {  
  14.                                 return points;  
  15.                             }  
  16.                          };  


这是JDK1.5引入的,其实就是枚举常量类的代码封装简化而已. 
查看enum反编译后的代码与枚举常量类的结构非常相似. 
这可能是因为java的设计者一开始觉得enum与OO思想不符,所以没有提供支持,但是随着常量接口的滥用和枚举常量类方案的出现,才在JDK1.5里增加了enum. 

原文地址:http://blog.csdn.net/jxc/archive/2009/03/18/4001397.aspx 

分享到:
评论

相关推荐

    易语言C枚举常量转换

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

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

    在编程领域,枚举(Enumeration)是一种特殊的数据类型,它定义了一组命名的常量,这些常量在程序中代表特定的值。枚举在不同的编程语言中有着不同的实现方式和使用规则。在这个主题中,我们将关注的是C语言中的枚举...

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

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

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

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

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

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

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

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

    C枚举常量转换.rar

    在C编程语言中,枚举(enumeration)是一种特殊的类型定义,它允许程序员定义一组具有特定名字的整型常量。这些名字代表了特定的数值,通常用于简化代码的可读性和可维护性。枚举常量转换是编程中常见的一种操作,...

    enum枚举类的应用

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

    56个民族枚举类

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

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

    然而,可以通过其他方式来实现类似枚举的功能,例如定义常量或使用类。 这个压缩包文件可能包含了一个程序或者代码示例,演示了如何将C语言中的枚举常量转换为易语言可以理解和使用的格式。转换过程可能包括读取...

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

    枚举常量与普通常量的主要区别在于,普通常量通常用`#`开头,如`#MAX_SIZE`,而枚举常量则是`#枚举类型.常量名`的形式,如`#颜色.红色`。枚举常量属于特定的枚举类型,而普通常量没有这种类型限制。 4. 应用场景...

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

    - 转换接口:对外提供的函数或子程序,供其他易语言代码调用来进行枚举常量的转换。 学习并理解这个源码,不仅可以帮助你理解C语言枚举和易语言常量之间的转换原理,还能提升你在易语言中处理跨语言交互问题的能力...

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

    本压缩包"易语言源码C枚举常量转换易语言源码.rar"是关于在易语言中处理C语言枚举常量转换的实践代码资源。 在C语言中,枚举(enum)是一种定义常量集合的数据类型,它允许用户创建一组相关的整数值。枚举常量通常...

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

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

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

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量。枚举接口(Enum Set)是Java提供的一种高效、简洁的方式来处理枚举类型集合。本实例“实例181 - 遍历枚举接口的元素”主要探讨如何遍历和...

    enum枚举类的一些代码demo

    通过以上内容,我们可以看出Java的`enum`枚举类不仅限于简单的常量集合,它还支持丰富的特性,如方法、接口、构造函数等,使得枚举成为编写简洁、安全、可维护代码的重要工具。在实际编程中,我们应该根据需求灵活...

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

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

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

    枚举在Java编程语言中是一种强大的工具,它允许开发者定义一组相关的常量,并且提供了许多超越普通常量的功能。在JDK 1.5引入枚举类型后,它成为了一种更加灵活和可读的代码表示方式。以下将详细介绍枚举的几个主要...

    java枚举类用法

    Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...

Global site tag (gtag.js) - Google Analytics