JAVA枚举

很多编程语言都提供了枚举的概念,但是java直到1.5之后才提出了枚举的概念,出现比这个语言本身晚10年。

主要作用是用于定义有限个数对象的一种结构(多例设计),枚举就属于多例设计并且其结构要比多例设计要更加的简单。

1,枚举的基本定义

从JDK1.5之后在程序中提供了enum的关键字,利用此关键字可以实现枚举的定义。

范例:定义一个枚举

 enum Color {
RED,GREEN,BLUE;
} public class Main {
public static void main(String[] args) {
Color color=Color.RED;
System.out.println(color);
System.out.println("Hello World!");
}
}

在进行枚举处理的时候还可以利用values()方法获取所有的枚举对象进行输出。如果此时使用多例设计模式来进行设计,那么需要编写很多的程序代码,这样对于开发的复杂度是比较高的,因为里面牵扯到构造方法的私有化以及静态方法。多例设计与枚举设计可以实现相同的功能,但是枚举可以在程序编译的时候就判断所使用的实例化对象是否存在。

范例:获取所有的枚举对象

 enum Color {
RED,GREEN,BLUE;
} public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color);
}
System.out.println("Hello World!");
}
}

从JDK1.5追加了枚举结构之后,就可以在switch之中进行枚举项的判断。如果此时通过多例设计来实现同样的功能,那么就需要使用对象数组了。

范例:观察枚举和switch处理

 enum Color {
RED,GREEN,BLUE;
} public class Main {
public static void main(String[] args) {
Color color=Color.GREEN;
switch (color){//直接支持枚举
case RED:System.out.println("红色");break;
case GREEN:System.out.println("绿色");break;
case BLUE:System.out.println("蓝色");break;
}
System.out.println("Hello World!");
}
}

多例上是无法实现这种与switch直接连接的,多例要想实现它就需要编写大量的if判断。

2,enum类

严格意义上讲枚举并不属于一种新的结构,它的本质相当于一个类,但是这个类会默认继承Enum类,首先观察一下Enum类的基本定义。

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

extends Object

implements Comparable<E>, Serializable

现在定义的枚举类的类型就是Enum中所使用的E类型。下面我们观察Enum类中定义的方法:

No.

方法名称

类型

01

protected Enum(String name, int ordinal)

构造

传入名字和序号

02

public final String name()

普通

获得对象的名字

03

public final int ordinal()

普通

获得对象的序号

范例:检验上面方法

 enum Color {
RED,GREEN,BLUE;
} public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color.ordinal()+"-"+color.name());
}
System.out.println("Hello World!");
}
}

面试题:请解释enum和Enum的区别?在枚举中每一个对象的序号都是根据枚举对象的定义顺序决定的。

l enum是从JDK1.5之后提供的一个关键字,用于定义枚举类;

l Enum是一个抽象类,所有使用enum关键字定义的类就默认继承此类;

3,定义枚举结构

一直在强调枚举本身就是一个多例设计模式,那么既然是多例设计模式,那么在一个类之中可以定义的结构很多,例如:构造方法、普通方法、属性等,那么这些内容也可以在枚举类中直接定义,但是需要注意的是:枚举类中定义的构造方法不能采用非私有化定义(public无法使用)

范例:在美居类中定义其他的结构

 enum Color {
RED("红色"),GREEN("绿色"),BLUE("蓝色"); //枚举对象要写在第一行 //多例设计中每个对象都是一个static 的final常量,所以命名全部大写
private String title;
private Color(String title){
this.title=title;
}
@Override
public String toString(){
return this.title;
}
} public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color.ordinal()+"-"+color.name()+"-"+color);
}
System.out.println("Hello World!");
}
}

范例:让枚举实现接口本程序在简化程度上远远高于多例设计模式,除了这种基本的结构之外,在枚举类中也可以实现接口类的继承。

 interface IMessage{
public String getMessage();
}
enum Color implements IMessage{
RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象要写在第一行,多例设计中每个对象都是一个static 的final常量
private String title;
private Color(String title){
this.title=title;
}
@Override
public String getMessage() {
return this.title;
}
} public class Main {
public static void main(String[] args) {
IMessage msg=Color.GREEN;
System.out.println(msg.getMessage());
System.out.println("Hello World!");
}
}

范例:观察枚举中定义抽象方法枚举类中最有意思的是它可以直接定义抽象方法,并且要求每一个枚举对象都要独立覆写此抽象方法实现

 enum Color {
RED("红色"){
public String getMessage(){
return this.toString();
}
},GREEN("绿色"){
public String getMessage(){
return this.toString();
}
},BLUE("蓝色"){
public String getMessage(){
return this.toString();
}
};//枚举对象要写在第一行,多例设计中每个对象都是一个static 的final常量
private String title;
private Color(String title){
this.title=title;
}
public String toString(){
return this.title;
}
public abstract String getMessage();
} public class Main {
public static void main(String[] args) {
System.out.println(Color.GREEN.getMessage());
System.out.println("Hello World!");
}
}

枚举的定义是非常灵活的,但是在实际使用过程中,枚举更多情况下还是建议使用它的正确用法,就是定义一个实例对象即可。

4,枚举的实际使用

现在定义一个Person类,性别肯定不希望用户随便输入,所以使用枚举类最合适

范例:

 enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title){
this.title=title;
} public String toString(){
return this.title;
}
} class Person{
private String name;
private int age;
private Sex sex; public Person(String name, int age, Sex sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String toString(){
return "姓名:"+this.name+"、年龄:"+this.age+"、性别:"+this.sex;
}
} public class Main {
public static void main(String[] args) {
System.out.println(new Person("万雨",25,Sex.MALE));
System.out.println("Hello World!");
}
}

这个程序不使用枚举也可以正常实现,追加几个判断即可,所以对于枚举的使用全凭自愿。

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

  1. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  2. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

  3. 4)Java容器类相关知识

    1>Array 和 Arrays:   Arrays:用来操作array的工具类,其中包含一组static函数:      equals():比较两个array 是否相等. array拥有相同元 ...

  4. Java GC相关知识

    Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...

  5. Java继承相关知识总结

    Java继承的理解 一.概念: 一个新类从已有的类那里获得其已有的属性和方法,这种现象叫类的继承 这个新类称为子类,或派生类,已有的那个类叫做父类,或基类 继承的好处:代码得到极大的重用.形成一种类的 ...

  6. Java异常相关知识总结

    异常: 概述:java程序运行过程中出现的错误 常见的异常: StackOverflowError ArrayIndexOutOfBoundsException NullPointerExceptio ...

  7. Java——接口相关知识

    1.接口用interface来声明 //定义一个动物接口 public interface Animal{ public void eat(); public void travel(); } 2.接 ...

  8. Java多线程相关知识

    1)wait()  notify()  sleep() sleep是Thread类的函数,wait和notify是Object的函数. sleep的时候keep对象锁,wait的时候release 对 ...

  9. java相关知识集锦

    java语言基础知识: Java8 Stream语法详解 不用循环 java 8系列之Stream的基本语法详解 java8 stream filter等功能代替for Java中try catch ...

随机推荐

  1. decimal模块 --数字的精度、保留小数位数、取整问题

    开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应精度值 from decimal import ge ...

  2. window 定时任务小项目,每秒钟,每分钟访问url

    个人百度网盘中 链接: https://pan.baidu.com/s/15sK2H-OtrAkAYcXjsxwihA 提取码: awv3 复制这段内容后打开百度网盘手机App,操作更方便哦

  3. PHP学习之验证码类

    <?php $code = new Code(); $code->outImage(); class Code { //验证码个数 protected $number; //验证码类型 p ...

  4. AJAX异步对象,即XMLHttpRequest

    //创建AJAX异步对象,即XMLHttpRequest function createAJAX(){ var ajax = null; try{ ajax = new ActiveXObject(& ...

  5. 机器学习 - 案例 - 样本不均衡数据分析 - 信用卡诈骗 ( 标准化处理, 数据不均处理, 交叉验证, 评估, Recall值, 混淆矩阵, 阈值 )

    案例背景 银行评判用户的信用考量规避信用卡诈骗 ▒ 数据 数据共有 31 个特征, 为了安全起见数据已经向了模糊化处理无法读出真实信息目标 其中数据中的 class 特征标识为是否正常用户 (0 代表 ...

  6. 基于layui的表格异步删除,ajax的简单运用

    h话不多说,看图,点击删除,出现确认框,然后点击确认删除,直接删除数据, 因为是基于面向过程的,没有用php框架写,所以有3个文件: 第一个文件:data.php:用于从数据库中获取数据 <?p ...

  7. putty简易教程

    和xshell相比,putty除了每次登陆时需要鉴权之外,基本上体验都差不多,由于putty以命令行操作方式为主,因此使用效率上会略高于xshell. 1.下载 下载地址1:(最新版) https:/ ...

  8. 从源码看 Vue 中的 Mixin

    最近在做项目的时候碰到了一个奇怪的问题,通过 Vue.mixin 方法注入到 Vue 实例的一个方法不起作用了,后来经过仔细排查发现这个实例自己实现了一个同名方法,导致了 Vue.mixin 注入方法 ...

  9. hive基础指令

  10. 分布式存储ceph部署(2)

    一.部署准备: 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用:     1台部署节点(配一块硬盘,运行ceph-depo ...