Java 5.0新引进了一种类型:枚举类型。昨晚看了一下,语法还是比较复杂的,至少比C的枚举要复杂的很多,不过功能也强大了很多。具体语法请参见 JLS 8.9
1、定义一个功能简单的枚举类型,更定义一个简单的类很相似,例如
package
basic;
public
enum
Day
{
MONDAY, TUESDAT, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
-
跟类定义一样,枚举类型可以单独放在一个文件里,当一个枚举类型用public修饰时,它对其他包可见,否则只对同一个包中的类可见,这和类定义是一样的。
-
标识符 MONDAY, TUESDAY等就称为枚举常量(enumeration constants)
-
每一个枚举常量被隐式的声明成Day的一个public、static成员,而且其类型为Day,亦就是说这些常量是self-typed的
2、下面的定义也是合法的:
package basic;
public enum Day
{
MONDAY, TUESDAT, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY,
}
或
package basic;
public enum Day
{
MONDAY, TUESDAT, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY,;
}
或
package basic;
public enum Day
{
MONDAY, TUESDAT, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
但是当枚举类型有其他定义时,则分号;是必须的
3、声明、使用一个枚举类型:
(1)在同一个包中:
BasicMainClass.java
package
basic;
public
class
BasicMainClass
{
public
static
void
main(String args[])
{
Day today
=
Day.SATURDAY;
System.out.println(
"
Today is
"
+
today.toString().toLowerCase());
}
}
(2)在不同包中:
OtherMainClass.java
package
other;
import
basic.Day;
public
class
OtherMainClass
{
public
static
void
main(String [] args)
{
Day today
=
Day.SATURDAY;
System.out.println(
"
Today is
"
+
today.toString().toLowerCase());
}
}
4、枚举类型的性质:(摘自o'relly 出版的 Java in A Nutshell 5th)
-
Enumerated types have no public constructor. The only instances of an
enumerated type are those declared by the enum.
-
Enums are not Cloneable, so copies of the existing
instances cannot be created.
-
Enums implement java.io.Serializable so they can be
serialized, but the Java serialization mechanism handles them specially to
ensure that no new instances are ever created.
-
Instances of an
enumerated type are immutable: each enum value retains its identity. (We'll see
later in this chapter that you can add your own fields and methods to an
enumerated type, which means that you can create enumerated values that have
mutable portions. This is not recommended, but does not affect the basic
identity of each value.)
-
Instances of an enumerated type are stored in public static
final fields of the type itself. Because these fields are final,
they cannot be overwritten with inappropriate values: you can't assign the
DownloadStatus.ERROR value to the DownloadStatus.DONE
field,
for example.
-
By convention, the values of enumerated types are written using
all capital letters, just as other static final fields are.
-
Because there is a strictly limited set of distinct enumerated
values, it is always safe to compare enum values using the = = operator instead of calling the
equals() method.
-
Enumerated types do have a working equals( ) method,
however. The method uses = =finalso that
it cannot be overridden. This working equals( ) method allows
enumerated values to be used as members of collections such as Set,
List, and Map.
internally and is
-
Enumerated types have a working hashCode() method consistent with their equals(
)equals(), hashCode( ) is final.
It allows enumerated values to be used with classes like
java.util.HashMap.
method. Like
-
Enumerated types implement java.lang.Comparable, and the compareTo() method orders enumerated values in the
order in which they appear in the enum declaration.
-
Enumerated types include a working toString( ) method that returns the name of the
enumerated value. For example, DownloadStatus.DONE.toString( ) returns
the string "DONE" by default. This method is not final, and
enum types can provide a custom implementation if they choose.
-
Enumerated types provide a static valueOf( ) method that does the opposite of the
default
toString( ) method. For example,
DownloadStatus.valueOf("DONE") would return
DownloadStatus.DONE.
-
Enumerated types define a final instance method namedordinal()that returns an integer for each enumerated
value. The ordinal of an enumerated value represents its position (starting at
zero) in the list of value names in the enum declaration. You do not
typically need to use the ordinal( ) method, but it is used by a number
of enum-related facilities, as described later in the chapter.
-
Each enumerated type defines a static method named values(
) that returns an array of enumerated values of that type. This array
contains the complete set of values, in the order they were declared, and is
useful for iterating through the complete set of possible values. Because arrays
are mutable, the values( ) method always returns a newly created and
initialized array.
-
Enumerated types are subclasses of java.lang.Enum, which
is new in Java 5.0. (Enum is not itself an enumerated type.) You cannot
produce an enumerated type by manually extending the Enum class, and it
is a compilation error to attempt this. The only way to define an enumerated
type is with the enum keyword.
-
It is not possible to extend an enumerated type. Enumerated types
are effectively final, but the final keyword is neither
required nor permitted in their declarations. Because enums are effectively
final, they may not be abstract.
-
Like classes, enumerated types may implement one or more interfaces.