java 枚举的特性_Java中有些好的特性(二):枚举

我们这里getDisplayName的时候调用一个国际化的API,通过枚举构造器里传入的参数作为key获取国际化的表示。

Java的enum是类型安全、版本安全的

这样一说好像C#的enum不是类型安全的一样,哼!嗯,某种角度上来说C#(本文以C#指代整个.NET平台)的枚举真的不是类型安全的。比如下面的代码:

1: using System;

2: public enum Role:short

3: {

4:     Admin,Owner,Creator

5: }

6:

7: public class Program

8: {

9:     public static void Main(String[] args)

10:     {

11:         byte i = (byte)Role.Owner;

12:     }

13: }

即使我们给C#的enum指定了underlying type,但是我们还是可以将其任意的与基本类型进行转换。而且这种转换是静悄悄地进行的,编译器和运行时都不会提醒我们。

C#的enum完全是一个常量,所以跟C#的const一样还会带来版本的问题。比如A程序集定义了一个枚举Role,B程序集引用A程序集,使用Role,实际上在运行时B程序集不再需要A程序集了(大家知道什么原因吧)。这样如果A程序集修改了Role,比如修改了枚举常量的顺序:从Admin,Owner,Creator变为Admin,Creator,Owner。而B程序集没有重新编译,这个时候就会出现问题。

C#中实现Enum class

实际上Enum Class是一种模式,只是java的enum将这种模式放到了语言中,我们在C#里一样可以实现:

1: public sealed Class Role

2: {

3:     public static readonly Role Admin = new Role("role-admin");

4:     public static readonly Role Owner = new Role("role-owner");

5:     public static readonly Role Creator = new Creator("role-creator");

6:

7:     private String displayName;

8:

9:     private Role(String displayName)

10:     {

11:         this.displayName = displayName;

12:     }

13:

14:     public String DisplayName

15:     {

16:         get

17:         {

18:             Resource.Get(this.displayName);

19:         }

20:     }

21: }

只是实现起来比java的默认实现繁琐一点而已,毕竟那是人家语言的first class。

位标记

如果在C#的enum上添加[Flags]的特性话,这个enum就不再是enum了,就变成了位标记。位标记这东西在实现某些功能时确实非常滴方便,比如一个文件的属性:只读,只写,可读写,比如权限控制系统等等。Java的枚举就不能添加这么一个annotation了,不过Java有个EnumSet,我们借助这个API实现位标记同样的功能。

后记

Java的enum与C#的enum各有特色,Java的enum更灵活一些,C#的enum更轻型一些,但是使用时请注意C#的enum的一些问题。

相关链接:

【福利】填问卷送精选测试礼包+接口测试课程!为测试行业做点事!

22/2<12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值