Java中的典型场景

典型场景

以上枚举用法是最简单的,实际中枚举经常会有关联的实例变量和方法。比如,上面的Size例子,每个枚举值可能有关联的缩写和中文名称,可能需要静态方法根据缩写返回对应的枚举值,修改后的Size代码如代码清单5-13所示。

代码清单5-13 带有实例变量和方法的枚举类Size

public enum Size {

SMALL("S","小号"),

MEDIUM("M","中号"),

LARGE("L","大号");

private String abbr;

private String title;

private Size(String abbr, String title){

this.abbr = abbr;

this.title = title;

}

public String getAbbr() {

return abbr;

}

public String getTitle() {

return title;

}

public static Size fromAbbr(String abbr){

for(Size size : Size.values()){

if(size.getAbbr().equals(abbr)){

return size;

}

}

return null;

}

}

上述代码定义了两个实例变量abbr和title,以及对应的get方法,分别表示缩写和中文名称;定义了一个私有构造方法,接受缩写和中文名称,每个枚举值在定义的时候都传递了对应的值;同时定义了一个静态方法fromAbbr,根据缩写返回对应的枚举值。需要说明的是,枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。

这个枚举定义的使用与其他类类似,比如:

Size s = Size.MEDIUM;

System.out.println(s.getAbbr()); //输出M

s = Size.fromAbbr("L");

System.out.println(s.getTitle()); //输出“大号”

加了实例变量和方法后,枚举转换后的类与代码清单5-12类似,只是增加了对应的变量和方法,修改了构造方法,代码不同之处大概如代码清单5-14所示。

代码清单5-14 增加了实例变量和方法后的枚举类Size对应的普通类示意代码

public final class Size extends Enum<Size> {

public static final Size SMALL = new Size("SMALL",0, "S", "小号");

public static final Size MEDIUM = new Size("MEDIUM",1,"M","中号");

public static final Size LARGE = new Size("LARGE",2,"L","大号");

private String abbr;

private String title;

private Size(String name, int ordinal, String abbr, String title){

super(name, ordinal);

this.abbr = abbr;

this.title = title;

}

//其他代码

}

每个枚举值经常有一个关联的标识符(id),通常用int整数表示,使用整数可以节约存储空间,减少网络传输。一个自然的想法是使用枚举中自带的ordinal值,但ordinal值并不是一个好的选择。为什么呢?因为ordinal值会随着枚举值在定义中的位置变化而变化,但一般来说,我们希望id值和枚举值的关系保持不变,尤其是表示枚举值的id已经保存在了很多地方的时候。比如,上面的Size例子,Size.SMALL的ordinal值为0,我们希望0表示的就是Size.SMALL,但如果增加一个表示超小的值XSMALL:

public enum Size {

XSMALL, SMALL, MEDIUM, LARGE

}

这时,0就表示XSMALL了。所以,一般是增加一个实例变量表示id。使用实例变量的另一个好处是,id可以自己定义。比如,Size例子可以写为:

public enum Size {

XSMALL(10), SMALL(20), MEDIUM(30), LARGE(40);

private int id;

private Size(int id){

this.id = id;

}

public int getId() {

return id;

}

}

枚举还有一些高级用法,比如,每个枚举值可以有关联的类定义体,枚举类型可以声明抽象方法,每个枚举值中可以实现该方法,也可以重写枚举类型的其他方法。此外,枚举可以实现接口,也可以在接口中定义枚举,其使用相对较少,我们就不介绍了。

至此,关于枚举,我们就介绍完了,对于枚举类型的数据,虽然直接使用类也可以处理,但枚举类型更为简洁、安全和方便。

https://www.bilibili.com/video/BV13G4y1T79d/?spm_id_from=333.999.0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值