博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不一样的Java Enum
阅读量:7083 次
发布时间:2019-06-28

本文共 3999 字,大约阅读时间需要 13 分钟。

Emum是在Java5中引入的新特性,从那开始,它被广泛的用在不同的Java应用中,相比于C和C++的Enum,Java的Enum功能更加强大。但是很多开发人员暂时还没意识到它的强大之处,在Enum的一些细节问题上把握的还不到位。Enum的特性及相关资料可以整理出一本书也不为过,这里简单对Enum做个大概。主要讲解以下几个方面。

img_1ed741bf479fe333108196bf01e8b4e8.png
Java Enum
  1. Enum的介绍
  2. Enum的特性
  3. Enum的用法
  4. Enum的一些面试题
  5. Enum用法建议

什么是Enum

Enum是一个Java的关键字,用于表示一个固定的常用值。例如,每周的天数,每年的月数等。Enum是一种类型,就像Class和Interface可以用于定义一系列的Enum常量

Enum的特性

  • Enum常量隐式的加上了static和final,一旦被创建就无法修改
  • Enum提供了是类型安全的(type-safe)
  • Enum隐式的加上了values()方法,返回一个数组包含所有的Enum常量
  • 两个Enum常量可以使用 ==equals()方法比较
  • Enum可以用在switch语句中,就像int,String。
  • Enum有自己的名称空间
  • Enum可以实现Java接口
  • 可以在Enum中定义构造器

Enum的用法

1 . Enum的声明,Enum可以声明在一个类之外或者在类内部,但是不能在方法中。

// 外部声明Enumenum Color {    RED,GREEN,BLUE;}public class Test{    public static void main(String[] args)    {        Color c1 = Color.RED;        System.out.println(c1);    }}
//内部声明Enumpublic class Test{    enum Color    {        RED, GREEN, BLUE;    }        public static void main(String[] args)    {        Color c1 = Color.RED;        System.out.println(c1);    }}

2 . 在创建Enum常量的时候可以指定值,但是这个时候你需要定义一个成员变量构造器。构造器必须是private的,不然会报编译错误。

public enum Currency {    PENNY(1), NICKLE(5), DIME(10), QUARTER(25);    private int value;    private Currency(int value) {        this.value = value;    }}

3 . 使用==equals比较两个enum

因为enum对象都是继承自Enum类的,可以看到Enum中的equals方法为。
建议使用==方法,直接比较应该比调用方法的速度更快一些。另外==号还能防止NullPointerException

public final boolean equals(Object other) {        return this==other;    }

4 . 对Enum进行排序的时候,使用compareTo方法。

public final int compareTo(E o) {        Enum
other = (Enum
)o; Enum
self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; }

5 .有两个新的集合类EnumMapEnumSet ,他们两个是对Set和Map的高性能实现,当有机会使用它们的时候,尽量使用它们。

Enum面试问题

  1. 说说Enum的继承

    所有的enums隐式的extend了java.lang.Enum类,因为一个类只能extend一个父亲,所以enum不能extend其它的类。
    但是Enum可以实现许多接口

  2. Enum的values,ordinal,valueOf方法

    enums默认有values(),ordinal()和valueOf()方法。
    values()方法返回所有在enum中定义的常量值,以数组形式返回。
    ordinal()方法返回每个常量的索引下标,就像数组的下标
    valueOf()方法传入字符串参数,如果enum中存在对应字符串的常量值,则返回对应的enum常量

// 案例代码enum Color{    RED, GREEN, BLUE;}public class EnumLearn{    public static void main(String[] args)    {                Color arr[] = Color.values();                for (Color col : arr)        {            System.out.println(col + " at index "                    + col.ordinal());        }        System.out.println(Color.valueOf("RED"));    }}//输出RED at index 0GREEN at index 1BLUE at index 2RED

3 . Enum的构造器特性

enum可以有构造器方法,它的构造器方法会在enum类型加载的时候,按常量的个数顺序的执行
我们不能直接创建enum对象,因此我们也不能直接调用enum的构造器方法,构造器方法必须是private的

//案例代码enum AccountType implements Serializable,Cloneable{    SAVING, FIXED, CURRENT;    private AccountType()    {        System.out.println("It is a account type");    }}class EnumOne{    public static void main(String[]args)    {        System.out.println(AccountType.FIXED);    }}//输出结果It is a account typeIt is a account typeIt is a account typeFIXED

4 . Enum的单例模式优缺点

参考《Effitive Java》,优点大于缺点,因为enum是线程安全的,因此我们无需考虑单例模式的双重检查。主要原因:

  • enum的单例模式简单
  • enum是线程安全的
  • enum的单例模式自己处理序列化 *
// Enum的单例模式 VS 传统双重检查的单例模式//单例模式,仅需使用一行代码.// EasySingleton.INSTANCE,enum中也可以写其他方法public enum EasySingleton{    INSTANCE;}//传统模式public class DoubleCheckedLockingSingleton{     private volatile DoubleCheckedLockingSingleton INSTANCE;       private DoubleCheckedLockingSingleton(){}       public DoubleCheckedLockingSingleton getInstance(){         if(INSTANCE == null){            synchronized(DoubleCheckedLockingSingleton.class){                //  二次检查                if(INSTANCE == null){                    INSTANCE = new DoubleCheckedLockingSingleton();                }            }         }         return INSTANCE;     }}

5 . Enum的==equals的区别。

前面有提到。

6 . 我们能使用构造方法创建enum实例吗?

不能,enum的构造方法必须是私有的。

Enum的用法建议

在能想到使用Enum的时候可以考虑使用Enum。

  1. 使用Enum代替定义的相关int类型常量
  2. 能用到EnumSet和EnumMap的时候使用它们,后面会再说明它们两个的用法
  3. 表示固有的对象最好使用Enum

最后

看一些Java相关的面试题,发现Enum相关问题出现频率挺高的,在这里对enum用法做个整理。希望能帮助到大家

参考

  • 《Effictive Java》

转载地址:http://zsmml.baihongyu.com/

你可能感兴趣的文章
shell编程学习之sed
查看>>
Python学习笔记(2)--Python的安装
查看>>
使用cygwin/openSSH搭建windows下的SSH服务器
查看>>
Ubuntu里网卡IP设置的步骤&/etc/passwd文件
查看>>
排序规则引起的冲突问题
查看>>
onTouch事件传递机制
查看>>
那些年的坑--双精度数值转成整形
查看>>
宽依赖、窄依赖
查看>>
好程序员web前端系列之CSS3-3D
查看>>
xm 命令详解
查看>>
HttpClient4.x send json request
查看>>
mysql5.6基于GTID的主从复制
查看>>
iOS 获取Wifi的SSID及MAC地址
查看>>
认识六个被误解的Ruby特性
查看>>
Java线程:并发协作-生产者消费者模型
查看>>
libvirt API非阻塞调用及相关的原理分析
查看>>
老男孩第十四期Python学习班之Day06
查看>>
初尝Arduino
查看>>
使用 Apache POI 处理 Microsoft Office 文档
查看>>
决策树
查看>>