柚子快报激活码778899分享:Java 枚举类

http://www.51969.com/

一、枚举类定义

类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。举例如下:

星期:Monday(星期一)、......、Sunday(星期天)

性别:Man(男)、Woman(女)

季节:Spring(春节)......Winter(冬天) 

支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)

就职状态:Busy、Free、Vocation、Dimission

订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货)、

线程状态:创建、就绪、运行、阻塞、死亡

当需要定义一组常量时,强烈建议使用枚举类。

二、枚举类的实现

JDK1.5之前需要自定义枚举类

JDK 1.5 新增的 enum 关键字用于定义枚举类

1、自定义枚举类

要求:

 私有化类的构造器,保证不能在类的外部创建其对象

 在类的内部创建枚举类的实例。声明为:public static final

 对象如果有实例变量,应该声明为private final,并在构造器中初始化

//自定义枚举类

class Season{

//1.声明Season对象的属性:private final修饰

private final String seasonName;

private final String seasonDesc;

//2.私有化类的构造器,并给对象属性赋值

private Season(String seasonName,String seasonDesc){

this.seasonName = seasonName;

this.seasonDesc = seasonDesc;

}

//3.提供当前枚举类的多个对象:public static final的

public static final Season SPRING = new Season("春天","春暖花开");

public static final Season SUMMER = new Season("夏天","夏日炎炎");

public static final Season AUTUMN = new Season("秋天","秋高气爽");

public static final Season WINTER = new Season("冬天","冰天雪地");

//4.其他诉求1:获取枚举类对象的属性

public String getSeasonName() {

return seasonName;

}

public String getSeasonDesc() {

return seasonDesc;

}

//4.其他诉求1:提供toString()

@Override

public String toString() {

return "Season{" +

"seasonName='" + seasonName + '\'' +

", seasonDesc='" + seasonDesc + '\'' +

'}';

}

}

2、使用enum定义枚举类

使用说明

使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类

枚举类的构造器只能使用 private 权限修饰符

枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的实例系统会自动添加 public static final 修饰

必须在枚举类的第一行声明枚举类对象

 

枚举类的属性

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰

枚举类的使用 private final 修饰的属性应该在构造器中为其赋值

若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数

public enum SeasonEnum {

SPRING("春天","春风又绿江南岸"),//调用构造函数

SUMMER("夏天","映日荷花别样红"),

AUTUMN("秋天","秋水共长天一色"),

WINTER("冬天","窗含西岭千秋雪");

private final String seasonName;

private final String seasonDesc;

private SeasonEnum(String seasonName, String seasonDesc) {

this.seasonName = seasonName;

this.seasonDesc = seasonDesc;

}

public String getSeasonName() {

return seasonName;

}

public String getSeasonDesc() {

return seasonDesc;

}

}

JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。

enum Signal {

// 定义一个枚举类型

GREEN,YELLOW,RED

}

public class TrafficLight {

Signal color = Signal.RED;

public void change() {

switch(color) {

case RED:

color = Signal.GREEN;

break;

case YELLOW:

color = Signal.RED;

break;

case GREEN:

color = Signal.YELLOW;

break;

}

}

}

三、Enum类的主要方法

values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。 

toString():返回当前枚举类对象常量的名称

当然和普通 Java 类一样,枚举类可以实现一个或多个接口

若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法

package com.atguigu.java;

/**

* 使用enum关键字定义枚举类

* 说明:定义的枚举类默认继承于java.lang.Enum类

*

* @author shkstart

* @create 2019 上午 10:35

*/

public class SeasonTest1 {

public static void main(String[] args) {

Season1 summer = Season1.SUMMER;

//toString():返回枚举类对象的名称

System.out.println(summer.toString());

// System.out.println(Season1.class.getSuperclass());

System.out.println("****************");

//values():返回所有的枚举类对象构成的数组

Season1[] values = Season1.values();

for(int i = 0;i < values.length;i++){

System.out.println(values[i]);

values[i].show();

}

System.out.println("****************");

Thread.State[] values1 = Thread.State.values();

for (int i = 0; i < values1.length; i++) {

System.out.println(values1[i]);

}

//valueOf(String objName):返回枚举类中对象名是objName的对象。

Season1 winter = Season1.valueOf("WINTER");

//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException

// Season1 winter = Season1.valueOf("WINTER1");

System.out.println(winter);

winter.show();

}

}

// 接口

interface Info{

void show();

}

//使用enum关键字枚举类 实现接口

enum Season1 implements Info{

//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束

SPRING("春天","春暖花开"){

@Override

public void show() {

System.out.println("春天在哪里?");

}

},

SUMMER("夏天","夏日炎炎"){

@Override

public void show() {

System.out.println("宁夏");

}

},

AUTUMN("秋天","秋高气爽"){

@Override

public void show() {

System.out.println("秋天不回来");

}

},

WINTER("冬天","冰天雪地"){

@Override

public void show() {

System.out.println("大约在冬季");

}

};

//2.声明Season对象的属性:private final修饰

private final String seasonName;

private final String seasonDesc;

//2.私有化类的构造器,并给对象属性赋值

private Season1(String seasonName,String seasonDesc){

this.seasonName = seasonName;

this.seasonDesc = seasonDesc;

}

//4.其他诉求1:获取枚举类对象的属性

public String getSeasonName() {

return seasonName;

}

public String getSeasonDesc() {

return seasonDesc;

}

// //4.其他诉求1:提供toString()

//

// @Override

// public String toString() {

// return "Season1{" +

// "seasonName='" + seasonName + '\'' +

// ", seasonDesc='" + seasonDesc + '\'' +

// '}';

// }

// @Override

// public void show() {

// System.out.println("这是一个季节");

// }

}

 

四、EnumMap 与 EnumSet

为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。

EnumMap 类

EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。下面是使用 EnumMap 的一个代码示例。枚举类型 DataBaseType 里存放了现在支持的所有数据库类型。针对不同的数据库,一些数据库相关的方法需要返回不一样的值,例如示例中 getURL() 方法。

// 定义数据库类型枚举

public enum DataBaseType {

MYSQL,ORACLE,DB2,SQLSERVER

}

// 某类中定义的获取数据库URL的方法以及EnumMap的声明

private EnumMapurls = new EnumMap(DataBaseType.class);

public DataBaseInfo() {

urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");

urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb");

urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample");

urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb");

}

//根据不同的数据库类型,返回对应的URL

// @param type DataBaseType 枚举类新实例

// @return

public String getURL(DataBaseType type) {

return this.urls.get(type);

}

在实际使用中,EnumMap 对象 urls 往往是由外部负责整个应用初始化的代码来填充的。这里为了演示方便,类自己做了内容填充。从本例中可以看出,使用 EnumMap 可以很方便地为枚举类型在不同的环境中绑定到不同的值上。本例子中 getURL 绑定到 URL 上,在其他的代码中可能又被绑定到数据库驱动上去。

EnumSet 类

EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化,如表 所示。

 

方法名称

描述

allOf(Class element type)

创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象

complementOf(EnumSet s)

创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,

并包含所有 s 中未包含的枚举成员

copyOf(EnumSet s)

创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,

并与 s 包含相同的枚举成员

noneOf( elementType)

创建指定枚举类型的空 EnumSet 对象

of(E first,e...rest)

创建包含指定枚举成员的 EnumSet 对象

range(E from ,E to)

创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚

举成员

EnumSet 作为 Set 接口实现,它支持对包含的枚举常量的遍历。

for(Operation op:EnumSet.range(Operation.PLUS,Operation.MULTIPLY)) {

doSomeThing(op);

}

柚子快报激活码778899分享:Java 枚举类

http://www.51969.com/

查看原文