枚举类
枚举类创建
public enum TrafficSignal {
STOP, CAUTION, GO;
}
这就是一个基本的枚举类创建,定义了一个名为 TrafficSignal 的枚举类,里面隐式创建了3个静态的(static),不可变的(final)类对象STOP、CAUTION、GO。
因为对象已静态创建,所以使用枚举类对象时用类名调用即可 eg:
TrafficSignal.STOP;
TrafficSignal.CAUTION;
TrafficSignal.GO;
当然,枚举类值还可以是null。
作为类,枚举类可往里边再加一些成员 属性、方法、构造器
public class Test {
//把枚举类定义为成员内部类
public enum TrafficSignal {
//用有参构造器创建对象,即枚举值
STOP("red"), CAUTION("yellow"), GO("green");
/*相当于普通类的
public static final TrafficSignal STOP = new TrafficSignal("red");
*/
//定义属性 属性设置为private和final来不让外部访问和修改属性,因为枚举值不能被修改
private final String light;
//定义带参构造器 构造器设为私有来不让其他类创建新的该枚举类对象
private TrafficSignal(String t) {
light = t;
}
//定义方法 还可以定义访问器和修改器
public String format(String message) {
return message + " " + light;
}
}
public static void main(String[] args) {
System.out.println(TrafficSignal.GO.format("The light is"));
System.out.println(TrafficSignal.STOP.format("The light is"));
}
}
枚举类与普通类区别
-枚举类可实现一个或多个接口,使用enum定义的枚举类默认继承java.lang.Enum类(实现了java.lang.Serializable和java.lang.Comparable接口),而非Object类;
-枚举类构造器只能用private修饰,省略则默认private;
-枚举类所有实例须显示列出,中间用逗号 “,” 隔开,最后一个后用分号“ ; ”;
-所有枚举类都提供values方法,用来遍历所有枚举值;
和switch、增强for,一起使用
public class Test {
public enum TrafficSignal {
STOP, CAUTION, GO;
};
public static void main(String[] args) {
TrafficSignal theLight = TrafficSignal.GO;
switch (theLight) {
case STOP: //case后放枚举值,前面不用类名或对象标注
System.out.print("red");
break;
case CAUTION:
System.out.print("yellow");
break;
case GO:
System.out.print("green");
break;
}
//使用values遍历
for (TrafficSignal t : TrafficSignal.values()) {
System.out.println(t);
}
}
}
实现接口的枚举类
可使用匿名内部类
public enum TrafficSignal implements TrafficSignalDesc{
//用有参构造器创建对象,即枚举值
//使用匿名内部类
STOP("red")
{
public void info()
{
System.out.println("这个枚举值代表红灯");
}
},
CAUTION("yellow")
{
public void info()
{
System.out.println("这个枚举值代表黄灯");
}
},
GO("green")
{
public void info()
{
System.out.println("这个枚举值代表绿灯");
}
},;
//定义属性 属性设置为private和final来不让外部访问和修改属性,因为枚举值不能被修改
private final String light;
//定义带参构造器 构造器设为私有来不让其他类创建新的该枚举类对象
private TrafficSignal(String t) {
light = t;
}
//定义方法 还可以定义访问器和修改器
public String format(String message) {
return message + " " + light;
}
public static void main(String[] args)
{
TrafficSignal g = Enum.valueOf(TrafficSignal.class , "GO");
//使用从接口实现的方法
g.info();
}
}
public interface TrafficSignalDesc
{
void info();
}
包含抽象方法的枚举类
使用含抽象方法的枚举类即在类里定义抽象方法,定义类时enum前不用加abstract,然后可用匿名内部类方式覆写(与实现接口覆写方式一样)
设置不可变类
- 用private和final修饰符修饰该类属性;
- 提供带参构造器,用于根据传入参数初始化类的属性;
- 仅为该类属性提供访问器getter方法,不提供修改器setter;
- if necessary,重写Object类的hashCode和equals方法(两者结果须一致);
不可变类:8个包装类,String类