我们这里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