Java枚举的小知识点
enum 是jdk1.5引入的,使用它可以创建枚举类型,就像使用class创建类一样。
enum关键字创建的枚举类型默认是java.lang.Enum(一个抽象类)的子类
用法1 常量
一般定义常量都是 public static final …,现在可以把相关常量都放在一个枚举类里,而且枚举比常量提供更多方法
- enum season{
- Spring,Summer,Autumn,Winter
- }
用法2 switch jdk1.6之前只支持int,char,enum类型,使用enum,提高代码可读性
- enum season{
- Spring,Summer,Autumn,Winter
- }
- public
class SeasonEnum { - public
static
void main(String [] args) { - season current_season=season.Autumn;
- switch(current_season) {
- case Spring:System.out.println("当前季节是"+current_season+" 竹外桃花三两枝,春江水暖鸭先知");break;
- case Summer:System.out.println("当前季节是"+current_season+" 接天莲叶无穷碧,映日荷花别样红");break;
- case Autumn:System.out.println("当前季节是"+current_season+" 停车做外枫林晚,霜叶红于二月花");break;
- case Winter:System.out.println("当前季节是"+current_season+" 忽如一夜出风来,千树万树梨花开");break;
- }
- }
- }
用法3 向枚举类中添加新方法 如果打算自己定义方法,必须在enum实例序列最后添加一个分号,而且必须先定义enum实例。
用法4 覆盖枚举的方法
- public enum CarInfoEnum {
- dongfeng("东风",15.8),
- benchi("奔驰",25.0),
- yiqi("一汽",18.5),
- baoma("宝马",35.7),
- xuelai("雪莱",100.5),
- ;
- /**
- * enum的构造方法要么是private ,要么是默认(默认私有),prtected和public都不行
- * @param name
- * @param price
- */
- CarInfoEnum(String name,Double price) {
- this.name=name;
- this.price= price;
- }
- private String name;
- private Double price;
- public String getName() {
- return name;
- }
- public
void setName(String name) { - this.name = name;
- }
- public Double getPrice() {
- return price;
- }
- public
void setPrice(Double price) { - this.price = price;
- }
- @Override
- public String toString() {
- return "名称:"+this.getName()+" 价格:"+this.getPrice();
- }
- public
static
void main(String [] args) { - //获取枚举对象
- CarInfoEnum carEnum =CarInfoEnum.valueOf("dongfeng");
- System.out.println(carEnum.toString());
- //枚举遍历 方法1 使用java8新特性 方法引用、lambda表达式、Stream流
- CarInfoEnum[] cars= CarInfoEnum.values();
- Stream.of(cars).forEach(System.out::println);
- //枚举遍历 方法2 增强for
- for(CarInfoEnum car :CarInfoEnum.values()) {
- System.out.println(car);
- }
- }
- }
用法5 实现接口 所有枚举都继承自java.lang.Enum类,java类单继承,接口多继承,枚举对象可以实现多个接口。
用法6 使用接口组织枚举
- /*@description 使用接口组织枚举 对一组数据分类,食物菜单分类而且希望这些菜单都属于food类型,如mainCourse主菜,fruit水果 drink 饮品
- *每种分类下有多种具体的菜式或食品,此时可以利用接口组织
- */
- public
interface Food { - enum mainCourse implements Food{
- RICE,NOODLES,DUMPLING,CHINKEN,BEEF;
- }
- enum fruit implements Food{
- BANANA,APPLE,ORANGE,PEAR;
- }
- enum drink implements Food{
- TEA, MILK,COFFEE,GREEN_TEA,RED_TEA;
- }
- }
- public
class TypeOfFood { - public
static
void main(String [] args) { - Food food=mainCourse.BEEF;
- System.out.println(food);
- food=fruit.APPLE;
- food=drink.COFFEE;
- }
- }
用法7 单例模式 由于枚举的构造默认是私有的,而且编译器jvm不允许使用反射机制创建枚举实例,因此使用枚举创建单例是非常安全,但是占用内存较大
- public enum SingletonEnum {
- INSTANCE,
- ;
- private String name; //该单例拥有的属性定义
- public String getName() {
- return name;
- }
- public
void setName(String name) { - this.name=name;
- }
- }
源码分析理解为什么枚举可以创建单例模式
枚举单例,使用SingletonEnum.INSTANCE进行访问,避免调用getInstance方法,完全不用考虑序列化和反射的问题。枚举序列化由jvm保证,每一个枚举类型和定义的枚举变量在jvm中唯一,在枚举类型序列化和反序列化上,java做如下规定:在序列化时java仅仅是将枚举对象的那么属性输出到结果,反序列化则是通过Enum的valueOf方法来根据名字查找枚举对象。同时编译器是不允许任何对这种序列化机制的定制的,并禁用了redObject,readObjectNoData,writeObject等,从而保证枚举实例唯一性。看一下Enum类的valueOf方法
- public
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) { - //调用enumType(Class对象的引用)的enumConstantDirectory方法获取到一个Map集合,该集合存放key(枚举name为key)--à value(枚举实例变量为value)对
- T result = enumType.enumConstantDirectory().get(name);
- if (result != null)
- return result;
- if (name == null)
- throw
new NullPointerException("Name is null"); - throw
new IllegalArgumentException( - "No enum constant " + enumType.getCanonicalName() + "." + name);
- }
我们看一下Class类的enumConstantDirecotry方法
- Map<String, T> enumConstantDirectory() {
- if (enumConstantDirectory == null) {
- //getEnumConstantsShared最终通过反射调用枚举类的values方法
- T[] universe = getEnumConstantsShared();
- if (universe == null)
- throw
new IllegalArgumentException( - getName() + " is not an enum type");
- Map<String, T> m = new HashMap<>(2 * universe.length);
- //map存放了当前enum类的所有没举实例变量,以name为key值
- for (T constant : universe)
- m.put(((Enum<?>)constant).name(), constant);
- enumConstantDirectory = m;
- }
- return enumConstantDirectory;
- }
Java枚举的小知识点的更多相关文章
- 记录这段时间java编程的小知识点
记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift table 同时按,是整体左 ...
- Java枚举的小例子
有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的: 因为参数太多,if-else写起来就太不优雅了,可以参考 ...
- java中的小知识点
1.数据类型的相关知识点 1.1.java内置封装类的转换 java中内置的封装类Byte.Integer.Float.Double和Long都可以转换成double类型的数值:因为这些封装好的类中都 ...
- JAVA基础知识|小知识点
1.强烈建议,不使用char类型 那么,到底为什么java里不推荐使用char类型呢?其实,1个java的char字符并不完全等于一个unicode的字符.char采用的UCS-2编码,是一种淘汰的U ...
- java的单例模式小知识点
单例模式 目的 为了让一个类有且仅有一个实例 优点 只允许一个,节省空间 不用频繁创建删除,提高性能 缺点 不容易扩展 长期不使用会被系统当作垃圾回收,造成系统状态的丢失 实现 要点 防止外界随意的创 ...
- Java枚举的小用法
package com.lxc.wmb; public enum TestEnum { Success("200","成功!"), Faild("50 ...
- Java学习过程中的总结的小知识点(长期更新)
Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...
- C#、Java中的一些小知识点总结(持续更新......)
前言:在项目中,有时候一些小的知识,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小知识点,以备用,并持续更新...... 1.禁用DataGridV ...
- java小知识点简单回顾
1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...
随机推荐
- Mysql跨表更新
Mysql跨表更新一直是大家所关心的话题,本文介绍mysql多表 update在实践中几种不同的写法,需要的朋友可以参考下 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Pr ...
- 泛型集合List(C#)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...
- 面向对象【day07】:面向对象概念介绍(二)
本节内容 1.概念 2.特性 3.面向对象介绍 一丶概念 1.面向对象编程 OOP(Object-Oriented Programming)编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描 ...
- Linux命令之ll
ll命令 用处:以长格形式列出当前目录下的所有文件,每个文件的长度和创建时间不同. 用法:输入 ll 示例: 前面的一大串字母的意思,第一个要么是d要么是-,d的意思就是目录,-的意思就是文件.其后的 ...
- 学习windows编程 day3 之 自定义画笔的两种方法
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- 机器学习课程-第8周-聚类(Clustering)—K-Mean算法
1. 聚类(Clustering) 1.1 无监督学习: 简介 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签 ...
- python 小程序,打印数字
要求如下: 指定一个数字 x ,然后打印 1到x 的所有数字,并问是否继续打印,否退出程序,是就继续.再指定一个数字 y ,如果 y> x 就显示 x+1 到 y 的所有数字,y <= x ...
- Git 设置过滤忽略的文件或文件夹(ignore file)
我们一般向代码仓库提交项目的时候,一般需要忽略编译生成的中间文件以及文件夹的提交,因为它们是无用的,而且也会占用仓库的空间.一般只用提交.pro,.sln,makefile,程序源文件等编译必须用到的 ...
- mac系统如何在桌面新建文件(夹)
方法一:(终端方式,推荐) 1.在电脑上找到终端 2.指定你想要保存文件的路径,然后回车.例如桌面就是: cd desktop #或是 cd /Users/username/Desktop 有人问:假 ...
- 绕过CDN查看网站真实IP的一些办法
验证是否存在CDN最简单的办法 通过在线的多地ping,通过每个地区ping的结果得到IP. 看这些IP是否一致,如果都是一样的,极大可能不存在cdn,但不绝对. 如果这些IP大多数都不太一样或者规律 ...