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. java实现自定义同步组件的过程

    实现同步组件twinsLock:可以允许两个线程同时获取到锁,多出的其它线程将被阻塞. 以下是自定义的同步组件类,一般我们将自定义同步器Sync定义为同步组件TwinsLock的静态内部类. 实现同步 ...

  2. cache magic对pms模块的cache访问模式分析结果

    其中43.184的命中率只有不到70%,是要分析的对象:3.189是命中率98%左右,是做参考的对象. 基本统计:可以知道43.184的update和delete操作占总操作的比例要比3.189打不少 ...

  3. 手把手教你把5V的Arduino改造成3.3V版本

    Arduino Pro Mini是基于ATmega328的微控制板,支持5V/3.3V电压.但是我们比较容易买到的是5V供电的版本,有的时候需要用到3.3V版本(比如我们的软控DAC).怎样才能让这款 ...

  4. React Native真机红屏报错总结

    一.run-android报错:unable to load script from assets 'index.android.bundl' 解决: 1.进入\android\app\src\mai ...

  5. kotlin之包

    在kotlin中包的概念在表达方式上与Java完全一样,不过kotlin中的包和目录没有关系,kotlin包仅仅是为了引用文件中的资源而设计的. package loaderman.bar fun p ...

  6. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-1.快速搭建SpringBoot项目,采用Eclipse

    笔记 1.快速搭建SpringBoot项目,采用Eclipse     简介:使用SpringBoot start在线生成项目基本框架并导入到eclipse中 1.站点地址:http://start. ...

  7. kubernetes介绍(1)

    一.Kubernetes 介绍: kubernetes起源 Kubernetes (K8s) 是 Google 在 2014 年发布的一个开源项目. 据说 Google 的数据中心里运行着超过 20 ...

  8. Windows安装多个版本JDK如何切换

    本人电脑同时安装了jdk1.7和1.8,以下时切换jdk版本的方式: 1.修改环境变量: 2.修改注册表: 打开HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft 分别修改Jav ...

  9. prometheus 监控 jar应用服务 + 修改监听IP和端口

    1.修改服务的启动脚本 [root@do1cloud01 init.d]# vim learn-school nohup ${JAVA_HOME}/bin/java -javaagent:/usr/l ...

  10. flask LOCAL线程隔离技术

    from threading import Thread from werkzeug.local import Local local = Local()#实例化一个线程隔离对象 request = ...