java1.5特性_Java1.5新特性(二)

枚举

什么是枚举类型

单例模式是一个类只有一个实例,而枚举可以理解为多例,一个类有多个实例,单实例的个数不是无穷个,而是有限个。比如,一个星期类的实例只有七个,星期一到星期七。

实现多例类

import org.junit.Test;

public class Demo1 {

@Test

public void func1(){

MyEnum myEnum = MyEnum.A;

myEnum.hello();

}

}

/*

* 创建多例类

*/

class MyEnum{

public static final MyEnum A = new MyEnum();

public static final MyEnum B = new MyEnum();

public static final MyEnum C = new MyEnum();

private MyEnum(){

}

public void hello(){

System.out.println("hello!");

}

public static MyEnum valueOf(String s){

if(s.equals("A")){

return A;

}

else if(s.equals("B")){

return B;

}

else {

return C;

}

}

}

定义枚举类型

定义枚举类型需要使用enum关键字,比如:

public enum Direction{

FRONT,BEHIND,LEFT,RIGHT;

}

//调用时:

Direction d = Direction.FRONT;

Java1.5新增的枚举类型可以让我们在使用枚举时不用再自己创建多例类,可以使用枚举。创建枚举类的语法:

使用enum关键字

类体中只需要给出枚举项,多个枚举项之间使用逗号分隔

枚举类中可以使用构造器,方法和实例变量,如果枚举类中只有枚举项,可以省略最后一个枚举项后面的分号

枚举类需要注意的几点

枚举类的构造器,必须是private,默认不写也为private,枚举类的实例不能由外界来创建。

枚举类型可以在switch中使用,但是在case中不能使用case Direction.FRONT,因为编译器会根据switch中d的类型来判断每个枚举类型,在case中必须给出与d相同类型的枚举选项,而不能再有类型。

Direction d = Direction.FRONT;

switch(d) {

case FRONT: System.out.println("前面");break;

case BEHIND:System.out.println("后面");break;

case LEFT: System.out.println("左面");break;

case RIGHT: System.out.println("右面");break;

default:System.out.println("错误的方向");

}

Direction d1 = d;

System.out.println(d1);

所有枚举类都是Enum的子类

Enum,是所有枚举类的公共父类无需使用extends继承,Enum中的方法所有枚举类都拥有。

int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND;

boolean equals(Object o):比较两个枚举常量是否相等;

int hashCode():返回枚举常量的hashCode;

String name():返回枚举常量的名字;

int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;

String toString():把枚举常量转换成字符串;

static T valueOf(Class enumType, String name):把字符串转换成枚举常量。

枚举类可以有成员

枚举类和正常的类一样,可以有实例变量,实例方法,静态方法等等,只不过它的实例个数有限,不能再创建实例。

/*

* 定义枚举项,指定调用的构造器,并传递参数。

* 枚举类在实际编译过程中使用的还是public static final MyEnum A = new MyEnum();

* 重载了构造函数,所以A(要传入的参数和构造函数的参数一致)

*/

enum MyEnum2{

A("AAA"), B("BBB"), C("CCC");

private MyEnum2(String name){

System.out.println(name);

}

}

因为MyEnum2类只有一个唯一构造器,参数为string,所以在构造器中也要为其赋值。

枚举类中可以存在抽象方法

在枚举类中存在的抽象方法,在写枚举项时使用内部类实现该方法。

/*

* 如果枚举类中包含抽象方法

* 对每个枚举项进行使用内部类来实现

*/

enum MyEnum3{

A(){

@Override

public void function() {

System.out.println("AAAAA");

}

}, B(){

@Override

public void function() {

System.out.println("BBBBB");

}

}, C(){

@Override

public void function() {

System.out.println("CCCCC");

}

};

public abstract void function();

}

枚举类enum的value()方法

在Enum的API文档中没有找到这个方法,这个方法可以获取把枚举项放入一个枚举类的数组中。下面是枚举类和测试代码。

//枚举类

enum Myenum4{

A(1,"AAA"), B(2,"BBB"), C(3,"CCC");

private String message;

private int ordinal;

private Myenum4(int i, String s){

message = s;

ordinal = i;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

public int getOrdinal() {

return ordinal;

}

public void setOrdinal(int ordinal) {

this.ordinal = ordinal;

}

}

//测试方法

@Test

/*

* 枚举类的value()方法测试

*/

public void func4(){

Myenum4[] myenum4s = Myenum4.values();

for(Myenum4 m : myenum4s){

System.out.println(m + "(" + m.getOrdinal() + ", " + m.getMessage() + ")");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值