欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习笔记之Enum枚举(1)

程序员文章站 2024-02-04 14:10:34
...

Java学习笔记之Enum枚举(1)

前言

这是在学习Java过程中对自己遇到并得以解决的问题的一些记录,一方面是记录下来方便自己以后查询,一方面希望能帮到有同样疑惑的初学者!本文章参考了博主山高人为峰的文章和java官方文档(我使用的JavaSE8)并结合了自己的心路历程。

最基本的用法

在认识到Enum同样是一个标准Java类之前我们可以把枚举当成是一个和C语言中枚举一样的数据类型,只需要加上Java中的标识符private即可。举例:

import java.util.*
//enum声明与使用范例1
//声明
public enum Size
{
	//这里的分号可以省略不写,也可以加上
	SMALL,MEDIUM.LARGE
}

//使用已经定义的枚举创建一个新域
Size size_1 = Size.SAMLL;
Size size_2 = Size.LARGE;
//判断两个域是否相等
if(size_1 == size_2){ }
//打印到控制台,会输出字符串“STRING"
System.out.println(size_1);

到目前为止这跟C中的枚举没有任何区别。

了解Java中的Enum

首先查阅javadoc发现Enum 的声明为:

public abstract class Enum<E extends Enum<E>>;

也就是说首先Enum是一个标准类,它被标记为abstract 这意味着任何Enum不能实例化。也意味着我们自己声明的时候的语法等效于:

public final class Size extends java.lang.Enum;

但是当我继续看Core Java时候发现后面出现了一个很有意思的代码片

public enum Size
{
	//后面还有别的域和方法时候必须带分号,且实例声明必须放在最前
    SMALL("S"),MEDIUM("M").LARGE("L");

    private String abbreviation;

    private Level(String abbreviation){ this.abbreviation = abbreviation; }

    public String getAbbreviation()
    {
        return abbreviation;
    }
}

这段代码着实让我感到非常迷惑,我既不知道为什么SMALL后面还能打个括号带个字符串,也不知道后面定义的privateabbreviation和私有构造器有什么用。但是当我写出下列测试代码:

Size size = Size.SMALL;
System.out.println(size.getAbbreviation());

发现控制台输出了S,这就有意思了,这说明构造器的abbreviationSMALL后面括号里的内容是一样的,而且当我准备把构造器的修饰符修改为public时IDE报错,这时候我有点明白了前面的SMALL、MEDIUM、LARGE在java语法中是省略了写法的静态实例!在参考了Java文档和一些讲解之后我发现这里的SMALL应该是:

//这个语句实际上是通不过编译的,因为枚举不能被实例化,这只是用于说明发生了什么
public static final Size SMALL = new Size("S"); 

当你声明如下域时

Size size = Size.SMALL;

实际上是在把enum类中静态域的引用给了size,这也解释了为什么上面判断两个枚举是否相等时使用 == 运算符,因为只需要判断是否是同一个引用。那么很自然的我们还可以添加更多域和方法:

public enum Size
{
	//后面还有别的域和方法时候必须带分号,且实例声明必须放在最前
    SMALL("S",1),MEDIUM("M",2).LARGE("L",3);

    private String abbreviation;
    private int index;

    private Level(String abbreviation,int index)
    {
    	this.abbreviation = abbreviation;
    	this.index = index;
    }

    public String getAbbreviation()
    {
        return abbreviation;
    }
    
	public int getIndex()
    {
        return index;
    }
}

在有了自定义域之后我们可以重写toString() 语法来提供关于这个枚举的更多信息:

@override
public String toString()
{
	return String.format("name:%s,index:%d",getAbbreviation(),getIndex());
}

同时Enum类提供了一个**valueOf()**方法用于初始化枚举,用法如下:

//第一个参数是你自己定义的枚举的class,第二个参数是对应的域的名称
Size size = Enum.valueOf(Size.class,"SMALL");
//等效于
Size size = Size.SMALL;

后记

第一次在CSDN写博客,文字比较凌乱,算是记录学习的心路历程!希望能对同样有困惑搜索而来的你有所帮助!

链接

1.参考博主山高我为峰文章
2.JavaSE8官方文档下载地址