枚举的好处
- 保证类型安全
- 够直观
枚举的主流用法
- 普通常量用法
//Enum 的枚举值 默认都是 public static final 的
enum Zoo{
ORANGE, BLUE, WHITE
}
public class ProtectZoo{
Zoo z = Zoo.BLUE;
public void change(){
switch (z){
case BLUE:
break;
case WHITE:
break;
case ORANGE:
break;
}
}
}
- 自定义的枚举用法
enum Zoo{
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
//根据 "序数" 获取对应的动物的名称
public String getAnimalName(int ordinal){
//枚举使用这种遍历方式取值
for (Zoo animal : Zoo.values()){
if(animal.ordenal == ordinal){
return animal.name;
}
}
return null;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getOrdinal(){
return this.ordenal;
}
public void setOrdinal(int ordenal){
this.ordenal = ordenal;
}
//重写 枚举类 中的toString 方法,来实现自己的需求
@Override
public String toString(){
return "北京动物园:"+this.name+"-"+this.ordenal;
}
}
- 实现接口的枚举用法
interface Food{
void onSteamed();//清蒸
void onFried();//油炸
}
enum Zoo implements Food{
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
@Override
public void onSteamed() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
@Override
public void onFried() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
//根据 "序数" 获取对应的动物的名称
public String getAnimalName(int ordinal){
//枚举使用这种遍历方式取值
for (Zoo animal : Zoo.values()){
if(animal.ordenal == ordinal){
return animal.name;
}
}
return null;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getOrdinal(){
return this.ordenal;
}
public void setOrdinal(int ordenal){
this.ordenal = ordenal;
}
//重写 枚举类 中的toString 方法,来实现自己的需求
@Override
public String toString(){
return "北京动物园:"+this.name+"-"+this.ordenal;
}
}
- EnumSet和EnumMap的用法
EnumSet保证集合中的元素不重复;EnumMap保证的是key必须是Enum类型的元素,value是任意类型值。
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private EnumMap<Zoo, String> enumMap = new EnumMap<Zoo, String>(Zoo.class);
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
public void setZooCowName(String name){
enumMap.put(Zoo.COW, name);
}
}
- 枚举元素自定义用法
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, LION{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, COW{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
};
public String getAnimalName(){
//"这里随便写了一个获取动物名称的方法,为了让自定义元素去实现这个方法,完成自定义元素的目的"
String cowName = Zoo.COW.getAnimalName();
return cowName;
}
}
//Enum 的枚举值 默认都是 public static final 的
enum Zoo{
ORANGE, BLUE, WHITE
}
public class ProtectZoo{
Zoo z = Zoo.BLUE;
public void change(){
switch (z){
case BLUE:
break;
case WHITE:
break;
case ORANGE:
break;
}
}
}
- 自定义的枚举用法
enum Zoo{
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
//根据 "序数" 获取对应的动物的名称
public String getAnimalName(int ordinal){
//枚举使用这种遍历方式取值
for (Zoo animal : Zoo.values()){
if(animal.ordenal == ordinal){
return animal.name;
}
}
return null;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getOrdinal(){
return this.ordenal;
}
public void setOrdinal(int ordenal){
this.ordenal = ordenal;
}
//重写 枚举类 中的toString 方法,来实现自己的需求
@Override
public String toString(){
return "北京动物园:"+this.name+"-"+this.ordenal;
}
}
- 实现接口的枚举用法
interface Food{
void onSteamed();//清蒸
void onFried();//油炸
}
enum Zoo implements Food{
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
@Override
public void onSteamed() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
@Override
public void onFried() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
//根据 "序数" 获取对应的动物的名称
public String getAnimalName(int ordinal){
//枚举使用这种遍历方式取值
for (Zoo animal : Zoo.values()){
if(animal.ordenal == ordinal){
return animal.name;
}
}
return null;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getOrdinal(){
return this.ordenal;
}
public void setOrdinal(int ordenal){
this.ordenal = ordenal;
}
//重写 枚举类 中的toString 方法,来实现自己的需求
@Override
public String toString(){
return "北京动物园:"+this.name+"-"+this.ordenal;
}
}
- EnumSet和EnumMap的用法
EnumSet保证集合中的元素不重复;EnumMap保证的是key必须是Enum类型的元素,value是任意类型值。
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private EnumMap<Zoo, String> enumMap = new EnumMap<Zoo, String>(Zoo.class);
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
public void setZooCowName(String name){
enumMap.put(Zoo.COW, name);
}
}
- 枚举元素自定义用法
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, LION{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, COW{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
};
public String getAnimalName(){
//"这里随便写了一个获取动物名称的方法,为了让自定义元素去实现这个方法,完成自定义元素的目的"
String cowName = Zoo.COW.getAnimalName();
return cowName;
}
}
interface Food{
void onSteamed();//清蒸
void onFried();//油炸
}
enum Zoo implements Food{
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
@Override
public void onSteamed() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
@Override
public void onFried() {
//这里要实现接口的方法,然后在方法中做对应逻辑处理就ok
}
//根据 "序数" 获取对应的动物的名称
public String getAnimalName(int ordinal){
//枚举使用这种遍历方式取值
for (Zoo animal : Zoo.values()){
if(animal.ordenal == ordinal){
return animal.name;
}
}
return null;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getOrdinal(){
return this.ordenal;
}
public void setOrdinal(int ordenal){
this.ordenal = ordenal;
}
//重写 枚举类 中的toString 方法,来实现自己的需求
@Override
public String toString(){
return "北京动物园:"+this.name+"-"+this.ordenal;
}
}
- EnumSet和EnumMap的用法
EnumSet保证集合中的元素不重复;EnumMap保证的是key必须是Enum类型的元素,value是任意类型值。
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private EnumMap<Zoo, String> enumMap = new EnumMap<Zoo, String>(Zoo.class);
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
public void setZooCowName(String name){
enumMap.put(Zoo.COW, name);
}
}
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT("大象", 0), LION("狮子", 1), COW("牛", 2);
private String name;
private int ordenal;
private EnumMap<Zoo, String> enumMap = new EnumMap<Zoo, String>(Zoo.class);
private Zoo(String name, int ordinal){
//因为我们创建的枚举类(比如-Zoo)默认是继承Enum的。(因此此时的Zoo不能再继承任何class类,但是可以实现interface接口)
//不能有public 构造方法,为保证用户无法再创建枚举实例
//(覆盖父类)构造方法要私有
this.name = name;
this.ordenal = ordinal;
}
public void setZooCowName(String name){
enumMap.put(Zoo.COW, name);
}
}
- 枚举元素自定义用法
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, LION{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, COW{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
};
public String getAnimalName(){
//"这里随便写了一个获取动物名称的方法,为了让自定义元素去实现这个方法,完成自定义元素的目的"
String cowName = Zoo.COW.getAnimalName();
return cowName;
}
}
enum Zoo {
//这种自定义方法的,要在最后一个后面加分号 ";",并且要重写和下面参数对应的构造方法
//关键是这种枚举值的定义要放在首位
ELEPHANT{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, LION{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
}, COW{
@Override
public String getAnimalName() {
return super.getAnimalName();
}
};
public String getAnimalName(){
//"这里随便写了一个获取动物名称的方法,为了让自定义元素去实现这个方法,完成自定义元素的目的"
String cowName = Zoo.COW.getAnimalName();
return cowName;
}
}