虽然不是Java规范中的原始部分,然而在Java 5中额外添加的枚举类型却备受惹得,添加了新语言特性,使Java更加成熟。不幸的是,并不是所有开发人员都在使用枚举构造时,并没有完全使其发挥作用,这就意味着在非建设性的开发中浪费的时间。这里我们将看到一些有趣的、独特的方式,开发人员通过使用Java枚举类型简化了开发代码。
仔细看看枚举类型
表面看来,枚举类型顾名思义,很容易理解。下面的代码片段是一个典型的例子:
enum codes { one, two, three; } enum cards { hearts, diamonds, clubs, spades; } |
了解对象成员
值得注意的是它与C++家族不同,无论是Java还是.NET中的枚举都只是助记符的替代品。相反,这两中技术中的枚举关键字创建了一个全功能类。
public String get(codes which) { return vals.get(which.ordinal()); } public String set(codes which, String sWho) { return vals.set(which.ordinal(), sWho); } |
虽然很多开发人员都熟悉枚举方法,如.ordinal(),但很少有人知道添加制定类是多少的简单:
public enum foonum { one, two, three; public static void SayHello(foonum val) { System.out.println(Hello + val); } public void greeting() { System.out.println(Greetings + this); } public static void main(String … args) { SayHello(foonum.two); foonum.two.greeting(); } } |
另外,拥有购置能力在枚举的name()类与可编辑的文本、XML或属性之间转换,这也是在人机界面中占进先机的一个好方法:
if(foonum.valueOf(two) == foonum.two) { System.out.println(Yes. We can translate, too.); } |
默认的大量枚举类型允许我们在一组从零开始的整数中转换,以及所有地枚举标记。保有原始C++枚举结构的精神,现代Java枚举与许多值有关。这种与其它值相关的能力,例如JfileChooser预枚举常量如FILES_ONLY,以及下面后悔无及的,都非常方便。当与其它值映射时,每一个枚举标记都可以 使用构造函数无需调用新的:
public enum ShowNode { BOTH(JFileChooser.FILES_AND_DIRECTORIES), FOLDERS(JFileChooser.DIRECTORIES_ONLY), FILES(JFileChooser.FILES_ONLY); private int code; ShowNode(int code) { this.code = code; } public int getCode() { return code; } public String getDescription() { switch (this) { case BOTH: return Select Files and Folders; case FOLDERS: return Select Folders; case FILES: return Select FIles; default: return Select Node; } } } <B>枚举类型转换成零开始的整数</B> |
但是还有另外一个有趣的主意:因为默认情况下,枚举类型使用从零开始的序数,所以使用任何枚举集的标记都很容易转换到一个从零开始的数组。应用程序的枚举的默认编号集是任意一组枚举器,些枚举器可用于快速创建一个类,就像许多值存储的机会一样。
class ClientSettings { ArrayList<String> vals = new ArrayList<String>(); public enum codes { // We could also use enums like name, address, phone (etc) one, two, three } public ClientSettings() { codes[] set = codes.values(); for (codes code : set) { vals.add(code.name()); } } public String get(codes which) { return vals.get(which.ordinal()); } public String set(codes which, String sWho) { return vals.set(which.ordinal(), sWho); } public static void main(String[] args) { ClientSettings ref = new ClientSettings(); if (ref.get(codes.two).equals(codes.two.name()) == false) { System.out.println(Error – Conceptual failure #1.); } String sTest = Enumerated arrays are so easy, they are scary.; ref.set(codes.two, sTest); if (ref.get(codes.two).equals(sTest) == false) { System.out.println(Error – Conceptual failure #2.); } } |
枚举是Java语言有史以来迫切需要的一种语言特性,如果有效使用它,开发人员可以在开发更健壮、更易维护的代码节省时间。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
内存数据网格提供商一头扎进Java
10年的时间里,应用性能解决方案提供商Alachisoft一直在用NCache(针对N-Tier和网格计算.NET应用的内存计算和数据网格产品)为.NET社区服务。
-
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高, 直到把内存吃完应用崩溃,但是这个wrapper
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高 […]
-
Google App Engine for Java 对于目前中国需要学习吗?
-
前无古人后无来者的Java平台
开发人员一直在致力于保持Java的活力,经过20年后,我们感觉从来没有更好的、更令人激动的时刻如同Java社区一样。