`
ijavagos
  • 浏览: 1241402 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java枚举,酷! (原文发表于2006-04-25 下午01:13:48)

阅读更多

当我头一次看到Java 5中的新登场的枚举类型(译注:enum)时,我还是持怀疑态度的。这些枚举类型允许你定义成员和方法(译注:variables and methods),甚至是抽象方法!你能用它来做什么呢?嗯,我现在已经找到了这个问题的答案。(至少是部分的)

在评阅和改进外面的一些源码的过程中,我有机会找到了一组用来代表月份的私有静态常量(译注:static final constants),并把他们转换成了Month枚举。起初,这个Month枚举仅仅是个简单的枚举,但随着我进一步改进这些源码时,我发现了越来越多的操作月份常量的方法,或者说,是一些与月份常量紧密关联的方法。每次我发现一个就把它放到Month枚举之中。结果如下:

import java.text.DateFormatSymbols;
public enum Month {
JANUARY(1), FEBRUARY(2), MARCH(3),
APRIL(4), MAY(5), JUNE(6),
JULY(7), AUGUST(8), SEPTEMBER(9),
OCTOBER(10),NOVEMBER(11),DECEMBER(12);

private static DateFormatSymbols dateFormatSymbols = new DateFormatSymbols();
private static final int[] LAST_DAY_OF_MONTH =
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

public int index;

Month(int index) {
this.index = index;
}

public static Month make(int monthIndex) {
for (Month m : Month.values()) {
if (m.index == monthIndex)
return m;
}
throw new IllegalArgumentException("Invalid month index " + monthIndex);
}

public int lastDay() {
return LAST_DAY_OF_MONTH[index];
}

public int quarter() {
return 1 + (index - 1) / 3;
}

public String toString() {
return dateFormatSymbols.getMonths()[index - 1];
}

public String toShortString() {
return dateFormatSymbols.getShortMonths()[index - 1];
}

public static Month parse(String s) {
s = s.trim();
for (Month m : Month.values())
if (m.matches(s))
return m;

try {
return make(Integer.parseInt(s));
}
catch (NumberFormatException e) {}
throw new IllegalArgumentException("Invalid month " + s);
}

private boolean matches(String s) {
return s.equalsIgnoreCase(toString()) ||
s.equalsIgnoreCase(toShortString());
}
}

我发现这很值得注意,也很有用。现在我就可像这样来描述事情:

Month m = Month.parse(inputString);

或是

Month m...;

int lastDay= m.lastDay();

Java 5的枚举并不定义常量,它们在一个类之中定义了单例(译注1)对象。有一个类叫Month,还有另外一个代表JANUARY的类从Month派生。这个JANUARY类有唯一的一个单例叫JANUARY。这个JANUARY类的单例就是JANUARY的枚举对象。

事实上,枚举是一种创建单例类的方法。每个枚举对象决不会拥有超过一个的实例,而且这个实例在枚举被使用之前(可能在加载过程中)就被构建了。而现在枚举对象就是一些类,它们充满着类天生的各种技能。下次你再想要单例的时候考虑一下这个:

enum Database {

INSTANCE;

public void open() {...}

...

}

你可以像这样来使用它:

Database.INSTANCE.open(...);

译注:

1,单例,原文singleton,一种常用的设计模式,详细介绍可参见uncle bob的著作《敏捷软件开发:原则、模式与实践》一书。

(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.JavaEnums; Robert C. Martin的英文blog网址:http://www.butunclebob.com/ArticleS.UncleBob

作者简介:Robert C. MartinObject Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。MartinPattern Languages of Program Design 3More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。

分享到:
评论

相关推荐

    Java 第二阶段建立编程思想 【枚举和注解】---- 代码

    Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 ...

    java枚举类型优秀源代码

    - **自动实现接口**:枚举类型会自动实现`java.lang.Enum<E>`接口,其中`E`是枚举类型的名称。 - **安全性**:枚举类型的成员是固定的,不允许外部添加或修改成员。 - **单例模式**:每个枚举成员都是单例的,只能被...

    列举java 枚举相关信息

    ### Java 枚举类型详解 #### 一、引言 枚举类型(Enum)是Java 5.0引入的一种新特性,它为开发者提供了一种更安全、更灵活的方式来处理一组固定数量的常量。相比于传统的使用整型或字符串来表示特定的值,枚举类型...

    java枚举类型说明

    ### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    附录C Excel 2010所有内置常数枚举.docx

    ### Excel 2010 VBA内置常数枚举知识点详解 #### 一、概述 在Excel 2010中,Visual Basic for Applications (VBA) 是一个强大的工具,用于自动化Excel的各种任务。为了更好地利用VBA进行编程,了解其内置的常数枚举...

    Java ---- enum --- 枚举类案例

    Java ---- enum --- 枚举类案例

    Java中的“枚举类型

    ### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...

    Java工作实用篇.pdf

    ### Java工作实用篇知识点概述 #### 1. Java生成带Logo及名称的二维码 - **技术背景**: 在当前数字化时代,二维码被广泛应用于各种场景,包括但不限于产品追踪、广告推广等。利用Java来生成带有公司Logo及商品名称...

    java编程基础-01

    - **2004年**: 发布Java 1.5 (Java 5),引入了泛型、枚举等重要特性。 - **2012年**: 发布Java 1.6 (Java 6),优化了性能,增加了新API。 - **2009年**: Oracle收购Sun Microsystems,接管了Java的发展。 - **2011年...

    简单总结java枚举类型

    枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用。以下是关于Java枚举类型的详细解释和相关知识点: 1. 定义枚举: 在Java中,枚举通过关键字`enum`来定义。例如,创建...

    Java枚举数据类型.doc

    - **标准库支持**:Java标准库中许多类如`java.util.concurrent.TimeUnit`就使用了枚举。 5. 优缺点 优点: - **类型安全**:枚举类型提供编译时检查,防止使用未定义的枚举值。 - **增强代码可读性**:枚举常量...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    2021年JAVA枚举类型知识点.docx

    Java中的枚举类型(enum)是面向对象编程中一种特殊的类,它用于定义一组固定的、预定义的值。枚举类型在2005年Java 5版本中引入,为编程提供了更多的类型安全性和可读性。以下是关于Java枚举类型的详细知识点: 1....

    java 基础教程 培训速成!一周学会!

    - **Java的历史与现状**:Java由Sun Microsystems公司于1995年推出,是目前应用最为广泛的编程语言之一。 - **Java的特点**: - 面向对象:Java完全支持面向对象编程,包括封装、继承和多态等特性。 - 平台无关性...

    深入体验Java+Web开发内幕-高级特性-高清扫描版

    - **枚举(Enum)**:Java的枚举类型为有限集合提供了更安全的表示方式,常用于定义常量集合并支持方法。 - **Lambda表达式**:Java 8引入的新特性,简化了函数式编程,使得代码更加简洁和易读。 2. **Web开发...

    Java软件开发实战 Java基础与案例开发详解 16-6 练习题 共4页.pdf

    第16章:Java注解 #### 16.6 本章练习 - **练习1**:创建一个`Person`类,并使用`@Override`注解覆盖其`toString()`方法。这要求学生理解`toString()`方法的作用以及如何正确地使用`@Override`注解来覆盖父类或...

    java笔记 java笔记

    - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。 #### 1.2 运行原理 Java程序的运行分为几个阶段: 1. **编写**:使用文本编辑器编写源代码。 2. **编译**:使用`javac`命令将源代码编译成...

    Pro Java Programming, 2nd Edition

    - **面向对象编程基础**:Java是一种面向对象的语言,因此本书可能会详细介绍类、对象、继承、封装、多态等核心概念。 - **核心API介绍**:深入讲解Java的核心API,包括集合框架、输入/输出流、异常处理机制等。 - *...

Global site tag (gtag.js) - Google Analytics