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. Failed to configure a DataSource 'url' attribute问题解决

    才写了一行代码又报错了.. *************************** APPLICATION FAILED TO START *************************** De ...

  2. Leetcode题目160.相交链表(简单)

    题目描述 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = ...

  3. OUC_Summer Training_ DIV2_#7 718

    是18号做的题啦,现在才把报告补上是以前不重视报告的原因吧,不过现在真的很喜欢写报告,也希望能写一些有意义的东西出来. A - Dragons Time Limit:2000MS     Memory ...

  4. How to install WireShark on Linux

    https://linuxtechlab.com/install-wireshark-linux-centosubuntu/

  5. mysql数据库文件的真实的物理存储位置

    在MySQL客户端输入如下命令:show global variables like "%datadir%"; 一定要在最后加上英文的分号.

  6. CPU排行-台式

    此文已经于2017年11月1日更新!来源于极速空间 实际对比: intel i3-7100(双核四线程) CPU性能远超过 AMD X4 860K(四核四线程) intel i5-7500(四核四线程 ...

  7. matlab处理矩阵

    1.提取大矩阵的一列.一行元素:一列元素:  A(:,j)表示提取A矩阵的第j列全部元素一行元素:  A(i,:)表示提取A矩阵的第i行元素,于是我们有,A(i, j)表示提取A矩阵的第i行第j列的元 ...

  8. DisplayUtils

    import android.app.Activity; import android.content.Context; import android.graphics.Rect; import an ...

  9. Python - selectors 模块

    selectors 模块 它的功能与 linux 的 epoll,还是 select 模块,  poll 等类似: 实现高效的 I/O multiplexing ,  常用于非阻塞的 socket  ...

  10. 深度学习之Faster-R-CNN

    哎!还是看大神博客吧 https://blog.csdn.net/liuxiaoheng1992/article/details/81843363