返回顶部
首页 > 资讯 > 数据库 >JAVA中的枚举(一)
  • 149
分享到

JAVA中的枚举(一)

2024-04-02 19:04:59 149人浏览 八月长安
摘要

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Ja

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例:

public class WeekDay {
        public static final int MONDAY = 1;
        public static final int TUESDAY = 2;
        public static final int WENSDAY = 3;
        public static final int THURSDAY = 4;
        public static final int FRIDAY = 5;
}

现在,你的类就可以使用像WeekDay.TUESDAY这样的常量了。但是这里隐藏着一些问题,这些常量是Java中int类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和WeekDay中定义的所有日期都对应不上。因此,您需要检测上界和下界,在出现无效值的时候,可能还要抛出一个IllegalArgumentException。而且,如果后来又添加另外一个日期(例如WeekDay.SATURDAY ),那么必须改变所有代码中的上界,才能接受这个新值。换句话说,在使用这类带有整型常量的类时,这个方案也许可行,但并不是非常有效。

     Joshua Bloch老大这时站了出来,在他的著作《Effective Java》中提出了在这样场景下的一种非常好的模式——Type-safe enumeration pattern。这个模式简而言之就是给这样的常量类一个私有的构造方法,然后声明一些public static final 的同类型的变量暴露给使用者,例如:

public class WeekDay {
         public static final WeekDay MONDAY = new WeekDay(1);
         public static final WeekDay TUESDAY = new WeekDay(2);
         public static final WeekDay WENSDAY = new WeekDay(3);
         public static final WeekDay THURSDAY = new WeekDay(4);
         public static final WeekDay FRIDAY = new WeekDay(5);
         
         public int getValue(){
                   return value;
         }
         
         private int value;
         
         private WeekDay(int i){
                   this.value = i;
         }
         //other methods...
}

这样做的好处是你的程序现在接受的不是int类型的数据了,而是WeekDay的一个预定义好的static final的实例(WeekDay.TUESDAY等 ),例如:

public void setWeekDay(WeekDay weekDay){...}

  而这样做也避免了可以随意向方法中传递一个不合法的int型数值(例如-1)而造成程序错误。同时,它还会带来其他的一些好处:由于这些枚举的对象都是一些类的实例,所以在里面放一些需要的属性来存放数据;又由于他们都是单例的,你可以使用equals方法或是==符号来比较它们。

Joshua Bloch大大提出的枚举模式,很好用但是好麻烦啊。如果你用过C/C++或是Pascal这样的语言的话一定会对它们的枚举类型有印象,例如在C/c++中我们可以这样定义

enum weekday {
   MONDAY,
   TUESDAY,
   WENSDAY,
   THURSDAY,
   FRIDAY
};

然后在程序中就可以用MONDAY、TUESDAY这些变量了。这样多方便,但是Java 1.4以前的版本并没有提供枚举类型的支持,所以如果你是用jdk 1.4开发程序的话就只能像Joshua Bloch老大那样写了。从java 5.0(代号为Tiger)开始,这种情况改变了,Java从语言层面支持了枚举类型。

    枚举是Tiger的一个很重要的新特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示,它使用“enum”关键字来定义。

    我们先来写一个简单的枚举类型的定义:

public enum WeekDay{
         MONDAY, TUESDAY, WENSDAY, THURSDAY, FRIDAY; //最后这个“;”可写可不写。
}

这和类、接口的定义很相像嘛!Tiger中的枚举类型就是一种使用特殊语法“enum”定义的类。所有的枚举类型是java.lang.Enum的子类。这是Tiger中新引入的一个类,它本身并不是枚举类型,但它定义了所有枚举类型所共有的行为,如下表:

JAVA中的枚举(一)

注意:虽然所有的枚举类型都继承自java.lang.Enum,但是你不能绕过关键字“enum”而使用直接继承Enum的方式来定义枚举类型。编译器会提示错误来阻止你这么做。

    WeekDay中定义的五个枚举常量之间使用“,”分割开来。这些常量默认都是“public static final”的,所以你就不必再为它们加上“public static final”修饰(编译器会提示出错),这也是为什么枚举常量采用大写字母来命名的原因。而且每一个常量都是枚举类型WeekDay的一个实例。你可以通过类似“WeekDay.MONDAY”这种格式来获取到WeekDay中定义的枚举常量,也可以采用类似“WeekDay oneDay = WeekDay.MONDAY”的方式为枚举类型变量赋值(你不能给枚举类型变量分配除了枚举常量和null以外的值,编译器会提示出错)。

    作为枚举类型实例的枚举常量是如何初始化的呢?其实答案很简单,这些枚举常量都是通过Enum中定义的构造函数进行初始化的。

//java.lang.Enum中定义的构造函数,
//两个参数分别是定义的枚举常量名称以及它所在的次序。
protected Enum(String name, int ordinal) {
                   this.name = name;
                   this.ordinal = ordinal;
}

在初始化的过程中,枚举常量的次序是按照声明的顺序安排的。第一个枚举常量的次序是0,依此累加。

    枚举类型除了拥有Enum提供的方法以外,还存在着两个隐藏着的与具体枚举类型相关的静态方法——values()和valueOf(String arg0)。方法values()可以获得包含所有枚举常量的数组;方法valueOf是java.lang.Enum中方法valueOf的简化版本,你可以通过它,根据传递的名称来得到当前枚举类型中匹配的枚举常量。


我们来看一个枚举类型使用的小例子。需求中要求可以对指定的日期进行相应的信息输出。对于这么简单的需求,这里就使用枚举类型来进行处理。前面我们已经定义好了包含有五个工作日的枚举类型。下面的代码则是进行输出的方法:


         public void printWeekDay(WeekDay weekDay){
            switch(weekDay){
             case MONDAY:
                System.out.println(“Today is Monday!”);
break;
             case TUESDAY: 
                System.out.println(“Today is Tuesday!”);
break;
             case WENSDAY: 
                System.out.println(“Today is Wensday!”);
break;
             case THURSDAY: 
                System.out.println(“Today is hursday!”);
break;      
             case FRIDAY: 
                System.out.println(“Today is Friday!”);
break;      
             default:
                throw new AssertionError("Unexpected value: " + weekDay);
                   }
         }

在Tiger以前,switch操作仅能对int、short、char和byte进行操作。而在Tiger中,switch增加了对枚举类型的支持,因为枚举类型仅含有有限个可以使用整数代替的枚举常量,这太适合使用switch语句了!就像上面代码中那样,你在swtich表达式中放置枚举类型变量,就可以在case标示中直接使用枚举类型中的枚举常量了。

注意:case标示的写法中没有枚举类型前缀,这意味着不能将代码写成 case Operation. PLUS,只需将其写成 case PLUS即可。否则,编译器会提示出错信息。

    像上面的例子一样,虽然你已经在case标示中穷尽了某个枚举类型中的所有枚举常量,但还是建议你在最后加上default标示(就像上面代码示意的那样)。因为万一为枚举类型添加一个新的枚举常量,而忘了在switch中添加相应的处理,是很难发现错误的。

为了更好的支持枚举类型,java.util中添加了两个新类:EnumMap和EnumSet。使用它们可以更高效的操作枚举类型。下面我一一介绍给你:

    EnumMap是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

    提示:EnumMap在内部使用枚举类型的ordinal()得到当前实例的声明次序,并使用这个次序维护枚举类型实例对应值在数组的位置。

    下面是使用EnumMap的一个代码示例。枚举类型DataBaseType里存放了现在支持的所有数据库类型。针对不同的数据库,一些数据库相关的方法需要返回不一样的值,示例中getURL就是一个。

//现支持的数据库类型枚举类型定义
public enum DataBaseType{
                   Mysql,oracle,DB2,sqlSERVER
}
 
//某类中定义的获取数据库URL的方法以及EnumMap的声明。
……
private EnumMap<DataBaseType ,String> urls =
new EnumMap<DataBaseType ,String>(DataBaseType.class);
                   
public DataBaseInfo(){
         urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");
         urls.put(DataBaseType.mysql,"jdbc:mysql://localhost/mydb");
         urls.put(DataBaseType.oracle,"jdbc:oracle:thin:@localhost:1521:sample");
         urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb");
}
 

public String getURL(DataBaseType type){
         return this.urls.get(type);
}

在实际使用中,EnumMap对象urls往往是由外部负责整个应用初始化的代码来填充的。这里为了演示方便,类自己做了内容填充。

    像例子中那样,使用EnumMap可以很方便的为枚举类型在不同的环境中绑定到不同的值上。如:例子中getURL绑定到URL上,在其它的代码中可能又被绑定到数据库驱动上去。

    EnumSet是枚举类型的高性能Set实现。它要求放入它的枚举常量必须属于同一枚举类型。EnumSet提供了许多工厂方法以便于初始化,见下表:

JAVA中的枚举(一)

  EnumSet作为Set接口实现,它支持对包含的枚举常量的遍历:

for(Operation op : EnumSet.range(Operation.PLUS , Operation.MULTIPLY)) {

                   doSomeThing(op);

}

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。


转载至:Http://blog.csdn.net/shimiso/article/details/5909217

您可能感兴趣的文档:

--结束END--

本文标题: JAVA中的枚举(一)

本文链接: https://lsjlt.com/news/37271.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JAVA中的枚举(一)
    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Ja...
    99+
    2024-04-02
  • java枚举
    目录 1.枚举的简介 2.枚举的形式和常用方法 3.枚举中的构造方法 4.练习实例 1.枚举的简介 枚举就是相当于一种来存放常量的特殊的类,是一种新的常量定义方式,提供了安全检查功能,简而言之就是把常量搞的有对象的特性了,类型也是和类...
    99+
    2023-09-02
    java 开发语言
  • 浅谈一下Java中枚举的用法
    目录枚举(enum)定义一个季节的枚举类枚举类values()方法ordinal()方法 valueOf()方法枚举类成员枚举(enum) 枚举是一个被命名的整型常数的集合...
    99+
    2023-05-14
    Java枚举 Java枚举的用法
  • 一文了解Java中枚举的使用
    目录概述枚举介绍和使用枚举的本质枚举常见用途枚举创建单例枚举抽象方法概述 Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,...
    99+
    2024-04-02
  • 一文带你读懂Java中的枚举
    这期内容当中小编将会给大家带来有关一文带你读懂Java中的枚举,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。enum 的全称为 enumeration, 是 JDK 5  中引入的新特性,存放在...
    99+
    2023-05-31
    java 枚举 ava
  • java中怎么继承一个枚举类
    在Java中,枚举类是不能被继承的。枚举类是通过使用`enum`关键字来定义的,它们是final的,意味着不能被继承。枚举类的实例是...
    99+
    2023-10-12
    java
  • Java的枚举,注解和反射(一)
    目录枚举什么是枚举?枚举类的实现自定义实现枚举类使用关键字enum定义枚举类Enum的常用方法实现接口的枚举类注解注解概述常见的注解总结枚举 什么是枚举? 枚举的字面意思就是 一一列...
    99+
    2024-04-02
  • 【Java】枚举类型
    文章目录 一、枚举类型1.1 什么是枚举类型1.2 Java中枚举类型的特点 二、枚举类型的使用2.1 创建语法2.2 常用方法2.3 使用案例 三、枚举的优缺点 一、枚举类型 ...
    99+
    2023-09-02
    java enum 枚举
  • 怎么用好Java中的枚举
    本篇内容主要讲解“怎么用好Java中的枚举”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用好Java中的枚举”吧!1、概览enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继...
    99+
    2023-06-16
  • Java中的枚举怎么使用
    本篇内容主要讲解“Java中的枚举怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的枚举怎么使用”吧!枚举(enum)枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数...
    99+
    2023-07-05
  • PHP 中的枚举
    本教程将教你如何在 PHP 8.1 之前和之后使用 PHP 中的枚举。 原因是在 PHP 8.1 之前,你只能使用抽象类来模拟枚举。但是,从 PHP 8.1 开始,PHP 提供了对枚举的原生支持。 ...
    99+
    2024-02-27
  • java中枚举类型定义和重写枚举的示例分析
    这篇文章将为大家详细讲解有关java中枚举类型定义和重写枚举的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是枚举类型枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用...
    99+
    2023-05-30
    java
  • 一文教你正确的在java中使用枚举
    一文教你正确的在java中使用枚举?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java枚举使用详解在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而...
    99+
    2023-05-31
    java 枚举 ava
  • 【javaSE】 枚举与枚举的使用
    文章目录 🎄枚举的背景及定义⚾枚举特性总结: 🌲枚举的使用🚩switch语句🚩常用方法📌示例一Ὄ...
    99+
    2023-09-20
    java 开发语言 枚举 源码 反射
  • 如何在Java中自定义一个枚举类
    本文章向大家介绍如何在Java中自定义一个枚举类的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序...
    99+
    2023-06-06
  • java中enum(枚举)的用法详解
    Java Enum原理: public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE };实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。因此,在比较两个枚举类型的值...
    99+
    2020-07-20
    java基础 java enum 用法
  • java中枚举的原理是什么
    java中枚举的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3...
    99+
    2023-06-14
  • java中枚举的用法有哪些
    在Java中,枚举(enum)是一种特殊的数据类型,用于定义一组常量。枚举常常用于表示一组相关的常量,例如星期几、月份等。以下是枚举...
    99+
    2023-08-30
    java
  • java枚举类型-Enum
    目录前言 应用 定义 基本Enum特性 Enum的静态导入 Enum中添加新方法 Switch语句中的Enum Enum的继承 EnumSet的使用 EnumMap的使用 常量相关方...
    99+
    2024-04-02
  • java枚举是什么
    java枚举是一种特殊的数据类型,它的本质是java.lang.Enum的子类,在java中被enum关键字修饰的类型就是枚举类型,它可以将常量组织起来,统一进行管理,如果枚举不添加任何方法,枚举值默认为从0开始的有序数值,除了不能继承,基...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作