当我头一次看到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. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。
分享到:
相关推荐
Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 Java 第二阶段建立编程思想 【枚举和注解】---- 代码 ...
- **自动实现接口**:枚举类型会自动实现`java.lang.Enum<E>`接口,其中`E`是枚举类型的名称。 - **安全性**:枚举类型的成员是固定的,不允许外部添加或修改成员。 - **单例模式**:每个枚举成员都是单例的,只能被...
### Java 枚举类型详解 #### 一、引言 枚举类型(Enum)是Java 5.0引入的一种新特性,它为开发者提供了一种更安全、更灵活的方式来处理一组固定数量的常量。相比于传统的使用整型或字符串来表示特定的值,枚举类型...
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
### Excel 2010 VBA内置常数枚举知识点详解 #### 一、概述 在Excel 2010中,Visual Basic for Applications (VBA) 是一个强大的工具,用于自动化Excel的各种任务。为了更好地利用VBA进行编程,了解其内置的常数枚举...
Java ---- enum --- 枚举类案例
### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...
### Java工作实用篇知识点概述 #### 1. Java生成带Logo及名称的二维码 - **技术背景**: 在当前数字化时代,二维码被广泛应用于各种场景,包括但不限于产品追踪、广告推广等。利用Java来生成带有公司Logo及商品名称...
- **2004年**: 发布Java 1.5 (Java 5),引入了泛型、枚举等重要特性。 - **2012年**: 发布Java 1.6 (Java 6),优化了性能,增加了新API。 - **2009年**: Oracle收购Sun Microsystems,接管了Java的发展。 - **2011年...
枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用。以下是关于Java枚举类型的详细解释和相关知识点: 1. 定义枚举: 在Java中,枚举通过关键字`enum`来定义。例如,创建...
- **标准库支持**:Java标准库中许多类如`java.util.concurrent.TimeUnit`就使用了枚举。 5. 优缺点 优点: - **类型安全**:枚举类型提供编译时检查,防止使用未定义的枚举值。 - **增强代码可读性**:枚举常量...
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
Java中的枚举类型(enum)是面向对象编程中一种特殊的类,它用于定义一组固定的、预定义的值。枚举类型在2005年Java 5版本中引入,为编程提供了更多的类型安全性和可读性。以下是关于Java枚举类型的详细知识点: 1....
- **Java的历史与现状**:Java由Sun Microsystems公司于1995年推出,是目前应用最为广泛的编程语言之一。 - **Java的特点**: - 面向对象:Java完全支持面向对象编程,包括封装、继承和多态等特性。 - 平台无关性...
- **枚举(Enum)**:Java的枚举类型为有限集合提供了更安全的表示方式,常用于定义常量集合并支持方法。 - **Lambda表达式**:Java 8引入的新特性,简化了函数式编程,使得代码更加简洁和易读。 2. **Web开发...
第16章:Java注解 #### 16.6 本章练习 - **练习1**:创建一个`Person`类,并使用`@Override`注解覆盖其`toString()`方法。这要求学生理解`toString()`方法的作用以及如何正确地使用`@Override`注解来覆盖父类或...
- **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。 #### 1.2 运行原理 Java程序的运行分为几个阶段: 1. **编写**:使用文本编辑器编写源代码。 2. **编译**:使用`javac`命令将源代码编译成...
- **面向对象编程基础**:Java是一种面向对象的语言,因此本书可能会详细介绍类、对象、继承、封装、多态等核心概念。 - **核心API介绍**:深入讲解Java的核心API,包括集合框架、输入/输出流、异常处理机制等。 - *...