Enum:
关键字Enum可以将一组具名的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用.
格式:
public enum ColorDemo3 {
;
}
这里面的;是不能省略的
错误写法:
public enum ColorDemo3 {
private Integer id;//;第一行主要是写要枚举的常量实例的强制必须写,当然也可以看作不用写即写一个;即可
;
private String name;
}
正确写法:
public enum ColorDemo3 {
;
private Integer id;
private String name;
}
//或者
public enum ColorDemo3 {
BLUE,GREEN,RED,YELLOW,BLACK,WRITE;
private Integer id;
private String name;
}
枚举的构造器传入参数
public enum ColorDemo3 {
BLUE("蓝色"),GREEN("绿色"),RED("红色"),YELLOW("黄色"),BLACK("黑色"),WRITE("白色");
private String name;
//构造器为有参构造器,因此上面的常量则必须传入String type value(必须传入)
ColorDemo3(String name) {
this.name = name;
}
}
当然如果你在编写一个无参的构造器那么枚举值则可以传入值也可以不用传入值
如:
public enum ColorDemo3 {
BLUE("蓝色"), GREEN("绿色"), RED, YELLOW, BLACK, WRITE;
private String name;
ColorDemo3(String name) {
this.name = name;
}
ColorDemo3() {
}
}
code Enum一共可以传入两个类型的参数
jdk:protected Enum(String name,int ordinal)
因此现在构造器把另外一个参数也加上,这里要注意参数的顺序
example:
public enum ColorDemo3 {
BLUE(1,"蓝色"), GREEN(2,"绿色"), RED, YELLOW, BLACK, WRITE;//注意参数顺序和构造器一致
private Integer id;
private String name;
ColorDemo3(Integer id, String name) {
this.id = id;
this.name = name;
}
ColorDemo3() {
}
}
下面我copy JDK Enum的method
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString() 返回枚举常量的名称,它包含在声明中。
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
对变量name和id加上setter和getter
public enum ColorDemo3 {
BLUE(1, "蓝色"), GREEN(2, "绿色"), RED(4, "红色"), YELLOW, BLACK, WRITE;
private Integer id;
private String name;
ColorDemo3(Integer id, String name) {
this.id = id;
this.name = name;
}
ColorDemo3() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
由于Enum编译之后还是Java类文件所以可以在Enum中直接添加main method 因此直接在例子中测试
code:
public enum ColorDemo3 {
BLUE(1, "蓝色"), GREEN(2, "绿色"), RED(4, "红色"), YELLOW, BLACK, WRITE;
private Integer id;
private String name;
ColorDemo3(Integer id, String name) {
this.id = id;
this.name = name;
}
ColorDemo3() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
ColorDemo3 color = ColorDemo3.RED;
System.out.println("name:"+color.name()+" ordinal:"+color.ordinal());
System.out.println("--name:"+color.getName()+" id:"+color.getId());
System.out.println(color.getDeclaringClass()+" "+color.toString());
}
}
打印结果如下:
name:RED ordinal:2
–name:红色 id:4
class com.code19.ColorDemo3 RED
BLUE(1, “蓝色”), GREEN(2, “绿色”), RED(4, “红色”)
也就是说RED被设置为了name而RED的索引刚好是2因此ordinal也就等于2了
为什么会这样呢?
我们再看下JDK API
Enum
protected Enum(String name,
int ordinal)
单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。
参数:
name - - 此枚举常量的名称,它是用来声明该常量的标识符。
ordinal - - 枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
在看下源码
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
private final String name;
public final String name() {
return name;
}
private final int ordinal;
public final int ordinal() {
return ordinal;
}
public String toString() {
return name;
}
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
}
其实我已经略入equals等method,在源码中我们看到Enum中并没有提供给我们可以修改name和ordinal的method
也就是说不能修改name和ordinal那么两个变量的值去哪获取呢答案是ordinal获取的是索引值
而name获取的是字面量的value
结论是我们提供了构造器与否都不能够改变两个变量的值