enum 是jdk1.5引入的,使用它可以创建枚举类型,就像使用class创建类一样。

enum关键字创建的枚举类型默认是java.lang.Enum(一个抽象类)的子类

用法1 常量

一般定义常量都是 public static final …,现在可以把相关常量都放在一个枚举类里,而且枚举比常量提供更多方法

  1. enum season{
  2.    Spring,Summer,Autumn,Winter
  3. }

用法2 switch jdk1.6之前只支持int,char,enum类型,使用enum,提高代码可读性

  1. enum season{
  2.    Spring,Summer,Autumn,Winter
  3. }
  4. public
    class SeasonEnum {
  5.    public
    static
    void main(String [] args) {
  6.       season current_season=season.Autumn;
  7.       switch(current_season) {
  8.       case Spring:System.out.println("当前季节是"+current_season+" 竹外桃花三两枝,春江水暖鸭先知");break;
  9.       case Summer:System.out.println("当前季节是"+current_season+" 接天莲叶无穷碧,映日荷花别样红");break;
  10.       case Autumn:System.out.println("当前季节是"+current_season+" 停车做外枫林晚,霜叶红于二月花");break;
  11.       case Winter:System.out.println("当前季节是"+current_season+" 忽如一夜出风来,千树万树梨花开");break;
  12.       }
  13.    }
  14. }

用法3 向枚举类中添加新方法 如果打算自己定义方法,必须在enum实例序列最后添加一个分号,而且必须先定义enum实例。

用法4 覆盖枚举的方法

  1. public enum CarInfoEnum {
  2.    dongfeng("东风",15.8),
  3.    benchi("奔驰",25.0),
  4.    yiqi("一汽",18.5),
  5.    baoma("宝马",35.7),
  6.    xuelai("雪莱",100.5),
  7.    ;
  8.  
  9.    /**
  10.     * enum的构造方法要么是private ,要么是默认(默认私有),prtected和public都不行
  11.     * @param name
  12.     * @param price
  13.     */
  14.    CarInfoEnum(String name,Double price) {
  15.       this.name=name;
  16.       this.price= price;
  17.    }
  18.  
  19.    private String name;
  20.    private Double price;
  21.  
  22.    public String getName() {
  23.       return name;
  24.    }
  25.    public
    void setName(String name) {
  26.       this.name = name;
  27.    }
  28.    public Double getPrice() {
  29.       return price;
  30.    }
  31.    public
    void setPrice(Double price) {
  32.       this.price = price;
  33.    }
  34.  
  35.    @Override
  36.    public String toString() {
  37.       return "名称:"+this.getName()+" 价格:"+this.getPrice();
  38.    }
  39.  
  40.    public
    static
    void main(String [] args) {
  41.       //获取枚举对象
  42.       CarInfoEnum carEnum =CarInfoEnum.valueOf("dongfeng");
  43.       System.out.println(carEnum.toString());
  44.  
  45.       //枚举遍历 方法1 使用java8新特性 方法引用、lambda表达式、Stream流
  46.       CarInfoEnum[] cars= CarInfoEnum.values();
  47.       Stream.of(cars).forEach(System.out::println);
  48.  
  49.       //枚举遍历 方法2 增强for
  50.       for(CarInfoEnum car :CarInfoEnum.values()) {
  51.          System.out.println(car);
  52.       }
  53.    }
  54.  
  55. }

用法5 实现接口 所有枚举都继承自java.lang.Enum类,java类单继承,接口多继承,枚举对象可以实现多个接口。

 

用法6 使用接口组织枚举

  1.  /*@description 使用接口组织枚举 对一组数据分类,食物菜单分类而且希望这些菜单都属于food类型,如mainCourse主菜,fruit水果 drink 饮品
  2.  *每种分类下有多种具体的菜式或食品,此时可以利用接口组织
  3. */
  4. public
    interface Food {
  5.    enum mainCourse implements Food{
  6.       RICE,NOODLES,DUMPLING,CHINKEN,BEEF;
  7.    }
  8.  
  9.    enum fruit implements Food{
  10.       BANANA,APPLE,ORANGE,PEAR;
  11.    }
  12.  
  13.    enum drink implements Food{
  14.       TEA, MILK,COFFEE,GREEN_TEA,RED_TEA;
  15.    }
  16. }
  17. public
    class TypeOfFood {
  18.  
  19.    public
    static
    void main(String [] args) {
  20.       Food food=mainCourse.BEEF;
  21.       System.out.println(food);
  22.       food=fruit.APPLE;
  23.       food=drink.COFFEE;
  24.    }
  25.  
  26. }

用法7 单例模式 由于枚举的构造默认是私有的,而且编译器jvm不允许使用反射机制创建枚举实例,因此使用枚举创建单例是非常安全,但是占用内存较大

  1. public enum SingletonEnum {
  2.    INSTANCE,
  3.    ;
  4.    private String name; //该单例拥有的属性定义
  5.  
  6.    public String getName() {
  7.       return name;
  8.    }
  9.  
  10.    public
    void setName(String name) {
  11.       this.name=name;
  12.    }
  13. }

源码分析理解为什么枚举可以创建单例模式

枚举单例,使用SingletonEnum.INSTANCE进行访问,避免调用getInstance方法,完全不用考虑序列化和反射的问题。枚举序列化由jvm保证,每一个枚举类型和定义的枚举变量在jvm中唯一,在枚举类型序列化和反序列化上,java做如下规定:在序列化时java仅仅是将枚举对象的那么属性输出到结果,反序列化则是通过Enum的valueOf方法来根据名字查找枚举对象。同时编译器是不允许任何对这种序列化机制的定制的,并禁用了redObject,readObjectNoData,writeObject等,从而保证枚举实例唯一性。看一下Enum类的valueOf方法

  1. public
    static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
  2.       //调用enumType(Class对象的引用)的enumConstantDirectory方法获取到一个Map集合,该集合存放key(枚举name为key)--à value(枚举实例变量为value)对
  3.  T result = enumType.enumConstantDirectory().get(name);
  4.        if (result != null)
  5.            return result;
  6.        if (name == null)
  7.            throw
    new NullPointerException("Name is null");
  8.        throw
    new IllegalArgumentException(
  9.            "No enum constant " + enumType.getCanonicalName() + "." + name);
  10.    }

我们看一下Class类的enumConstantDirecotry方法

  1. Map<String, T> enumConstantDirectory() {
  2.         if (enumConstantDirectory == null) {
  3. //getEnumConstantsShared最终通过反射调用枚举类的values方法
  4.             T[] universe = getEnumConstantsShared();
  5.             if (universe == null)
  6.                 throw
    new IllegalArgumentException(
  7.                     getName() + " is not an enum type");
  8.             Map<String, T> m = new HashMap<>(2 * universe.length);
  9. //map存放了当前enum类的所有没举实例变量,以name为key值
  10.             for (T constant : universe)
  11.                 m.put(((Enum<?>)constant).name(), constant);
  12.             enumConstantDirectory = m;
  13.         }
  14.         return enumConstantDirectory;
  15.     }

 

Java枚举的小知识点的更多相关文章

  1. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  2. Java枚举的小例子

    有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的: 因为参数太多,if-else写起来就太不优雅了,可以参考 ...

  3. java中的小知识点

    1.数据类型的相关知识点 1.1.java内置封装类的转换 java中内置的封装类Byte.Integer.Float.Double和Long都可以转换成double类型的数值:因为这些封装好的类中都 ...

  4. JAVA基础知识|小知识点

    1.强烈建议,不使用char类型 那么,到底为什么java里不推荐使用char类型呢?其实,1个java的char字符并不完全等于一个unicode的字符.char采用的UCS-2编码,是一种淘汰的U ...

  5. java的单例模式小知识点

    单例模式 目的 为了让一个类有且仅有一个实例 优点 只允许一个,节省空间 不用频繁创建删除,提高性能 缺点 不容易扩展 长期不使用会被系统当作垃圾回收,造成系统状态的丢失 实现 要点 防止外界随意的创 ...

  6. Java枚举的小用法

    package com.lxc.wmb; public enum TestEnum { Success("200","成功!"), Faild("50 ...

  7. Java学习过程中的总结的小知识点(长期更新)

    Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...

  8. C#、Java中的一些小知识点总结(持续更新......)

    前言:在项目中,有时候一些小的知识,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小知识点,以备用,并持续更新...... 1.禁用DataGridV ...

  9. java小知识点简单回顾

    1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...

随机推荐

  1. php 开启 opcache 之后 require、include 还会每次都重新加载文件吗?

    当前目录有以下两个文件 index.php <?php var_dump(require 'A.php'); A.php <?php return 123; 接着运行: php -S 0. ...

  2. urllib.parse.quote

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  3. 在tomcat集群下利用redis实现单点登陆

    场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到 ...

  4. javascript 事件冒泡与取消冒泡

    事件冒泡: 当一个元素上的事件被触发时,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先中被触发,这一过程被称为事件冒泡. 这个事件从原始祖先开始,一直冒泡到DOM树的最上层.(bug) ...

  5. 【小白技术笔记】保存皮皮虾APP无水印视频到手机相册,只需要三步 [技术干货]

    百万段友回皮皮虾,转身一变,都成了皮友.作为当年的资深段友,今天的皮友的我.看到好视频,经典视频,搞笑视频,就想保存一份到手机相册,然后皮皮虾啊皮皮虾,有个让人很讨厌的地方,保存视频的时候就有皮皮虾的 ...

  6. HDU - 5419 Victor and Toys(组合计数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5419 题意 n个物品,标号1-n,物品i有权值wi.现在有m个区间[l,r],从中任意选三个区间i,j,k,求物 ...

  7. 04-接口隔离原则(ISP)

    1. 背景 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类B和类D来说不是最小接口,则类B和类D不得不去实现它们不需要的方法. 2. 定义 一个类对另一个类的依赖应该建立在最小的接口 ...

  8. linux 更改文件夹所有者

    更改“tp5”文件的所有者为”www” chown -R tp5/ www 修改目录及其子目录的用户组为“www” chgrp -R www tp5 同时更改文件或目录的所有者和用户组 chown - ...

  9. Linux 重启网卡失败 Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.

    linux下重启网卡使用命令 : service network restart 时报错: [root@slave01 hadoop]# service network restart Startin ...

  10. CF912E Prime Gift

    传送门 看到\(n\)只有16,可以把这些质数分成两半,然后预处理出这些数相乘得出的小于\(10^{18}\)的所有数,排个序,然后二分最终答案,再用两个指针从前往后和从后往前扫,进行\(two-po ...