Enum(枚举类型)的基本应用

一.前言

在我们日常的开发过程中,我们经常定义使用常量;在Effective Java建议用枚举来替换常量的使用,提高我们代码的质量,总结一下枚举定义常量的基本使用

二.枚举类型说明

     1.枚举是一种数据类型,在jdk1.6版本才开始引入;

2.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内;

3.枚举定义了一组业务类型相同的成员且成员的语义清晰;

三.常量与枚举类型对比说明

常量存在问题:

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

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

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

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

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

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

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

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

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

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

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

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

四.枚举定义常量例子

public enum Color {

	/**
	 * 红色
	 */
	RED("1"),

	/**
	 * 黑色
	 */
	BANK("2"),

	/**
	 * 白色
	 */
	WHITH("3");

	private String value;

	private Color(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}	

}

说明:这个小例子定义了几种颜色,红色、黑色、白色分别用1、2、3来表示。在我们的开发使用中就可以用equest调用枚举来进行判断比较操作,提高了复用性,方便修改以及管理提高代码的质量。

枚举常量属于稳态型 

使用常量接口,我们得对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就是一件非常麻烦的事情,但这是一个不可逃避的过程。

public void describe(int s){
    //s变量不能超越边界,校验条件
    if(s >= 0 && s <4){
        switch(s){
            case Season.Summer:
                System.out.println("Summer is very hot!");
                break;
            case Season.Winter:
                System.out.println("Winter is very cold!");
                break;
        …..
        }
    }
} 

我们再来看看枚举常量是否能够避免校验问题,代码如下:

public void describe(Season s){
    switch(s){
        case Season.Summer:
            System.out.println("Summer is very hot!");
            break;
        case Season.Winter:
            System.out.println("Winter is very cold!");
            break;
        …...
    }
}

不用校验,已经限定了是Season枚举,所以只能是Season类的四个实例。这也是我们看重枚举的地方:在编译期间限定类型,不允许发生越界的情况。

五.总结

   虽然枚举在很多方面都比接口常量和类常量好用,但是它有一点比不上接口常量和类常量的,就是继承,枚举类型是不能有继承的,也就是说一个枚举常量定义完毕后,除非修改重构,否则无法做扩展。

六、建议 

    在 项目开发中,推荐使用枚举常量代替接口常量或类常量。

  

时间: 2024-10-20 18:33:03

Enum(枚举类型)的基本应用的相关文章

enum枚举类型的定义

enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, two, three, four, five };//0,1,2,3,4,5 TOT to1; to1 = five; switch (to1) { case 0:cout << "zero\n"; break; case 1:cout << "one\n

C语言——enum枚举类型

enum是枚举类型,实际上就是定义一组值,enum定义数据类型的值只能是这一组值中的一个. 在实际生活中,很多问题都与是这样的.如人的性别,只有男女两种:一星期有七天:月份只有十二个值. 如下定义一周七天的值: #include <stdio.h> typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }week; int main() { printf("%d %d %d %d %

开发中巧用Enum枚举类型

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个State字段的外键表去解释状态.(这一类型表状态的字段可能还会有很多,这里只是举个例)   我们一般会把这个State字段当成一个约定,去在项目中应用(比如:0:启用,1:禁用) 在后台管理或其它地方显示Int类型对应的实际状态时,再到公共类中去写一个方法,里面用一个switch...case去返回对应的中文解释. http://www.d

Java enum枚举类型

java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum EnumTest { FRANK("The given name of me"), LIU("The family name of me"); private String context; private String getContext(){ return this.

C语言--enum,typedef enum 枚举类型详解

原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6

enum枚举类型使用

package com.test.enums; import java.util.EnumMap; import java.util.EnumSet; /** * * @ClassName:  TestEnum * * @Description: 测试枚举 * @author PineTree * @date 2015年6月4日 上午9:54:34 * */ public class TestEnum { public static void main(String[] args) { // n

Enum枚举类型

枚举类型: 只能取特定值中的一个 使用enum关键字来定义一个类型 是java.lang.Enum类型 举例: public class TestEnum{ public enum MyColor { red, green, blue };//括号里的值相当于类里面的静态变量 public static void main(String[] args) { MyColor m = MyColor.red; switch(m) { case red: System.out.println("red

enum枚举类型 的用法

1.作为数组下标使用 enun  box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[ruler]="ruler"; } 2.对于那些只有几种可能取值的一类变量,作为枚举类型的具体实例变量只能去它的几个枚举元素值. 具体用法可参见周纯洁的C语言课本P259.

Swift 学习笔记 enum 枚举类型

异端,异端啊,我感觉这是map吧? 1 enum ATMStatus { 2 case Success(Int) 3 case Error(String) 4 } 5 6 var balance = 200 7 8 func withdraw(amount: Int) -> ATMStatus { 9 if balance >= amount { 10 balance -= amount 11 return .Success(balance) 12 } else { 13 return .Er

C#中的枚举类型(enum type)

ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, Blue } 声明一个名为 Color 的枚举类型,该类型具有三个成员:Red.Green 和 Blue. 枚举具体是怎么声明呢?枚举声明用于声明新的枚举类型.枚举声明以关键字 enum 开始,然后定义该枚举类型的名称.可访问性.基础类型和成员.具体格式: 修饰词(new.public.protect