写在之前
以下是《Java8编程入门官方教程》中的一些知识,如有错误,烦请指正。涉及的程序如需下载请移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip
枚举
定义新的数据类型的命名常量列表。一般使用枚举常量使用大写。这是因为枚举经常代替final变量,而final变量通常是大写的,所以程序员自然也习惯对枚举常量使用大写。Java将枚举实现为类类型,尽管不会使用new实例化枚举,但是可以给枚举提供构造函数,添加实例变量和方法,甚至实现接口。
// 枚举的创建和基本应用
// 声明一个枚举
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT //枚举常量
}
class EnumDemo {
public static void main(String args[])
{
Transport tp; //声明一个Transport引用
tp = Transport.AIRPLANE; //为tp赋值常量AIRPLANE
// Output an enum value.
System.out.println("Value of tp: " + tp);
System.out.println();
tp = Transport.TRAIN;
// Compare two enum values.
if(tp == Transport.TRAIN) //比较两个Transport对象是否相等
System.out.println("tp contains TRAIN.\n");
//使用枚举控制switch语句
switch(tp) {
case CAR:
System.out.println("A car carries people.");
break;
case TRUCK:
System.out.println("A truck carries freight.");
break;
case AIRPLANE:
System.out.println("An airplane flies.");
break;
case TRAIN:
System.out.println("A train runs on rails.");
break;
case BOAT:
System.out.println("A boat sails on water.");
break;
}
}
}
value()和valueOf()方法
所有枚举类型自动定义以上两种方法。
public static enum-type[] values()//返回一个枚举常量列表数组
public static enum-type[] valuesOf(String str)//返回一个枚举常量,传递给字符串
// Use the built-in enumeration methods.
// An enumeration of Transport varieties.
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT
}
class EnumDemo2 {
public static void main(String args[])
{
Transport tp;
System.out.println("Here are all Transport constants");
// use values()
Transport allTransports[] = Transport.values();
for(Transport t : allTransports)
System.out.println(t);
System.out.println();
// use valueOf()
tp = Transport.valueOf("AIRPLANE");
System.out.println("tp contains " + tp);
}
}
构造函数、方法、实例变量和枚举
枚举常量都是一个其枚举类型的对象。
枚举和final共存:枚举适合必须由标识符表示的条目列表的情况;final变量适合于常量值可用于多处地方的情况。
两点限制:枚举不能继承另一个类;enum不能是超类。
// Use an enum constructor, instance variable, and method.
enum Transport {
CAR(65), TRUCK(55), AIRPLANE(600), TRAIN(70), BOAT(22);
private int speed; // typical speed of each transport 添加一个实例变量
// Constructor
Transport(int s) { speed = s; }
int getSpeed() { return speed; } //添加一个方法
}
class EnumDemo3 {
public static void main(String args[])
{
Transport tp;
// Display speed of an airplane.
System.out.println("Typical speed for an airplane is " +
Transport.AIRPLANE.getSpeed() +
" miles per hour.\n");
// Display all Transports and speeds.
System.out.println("All Transport speeds: ");
for(Transport t : Transport.values())
System.out.println(t + " typical speed is " +
t.getSpeed() +
" miles per hour.");
}
}
枚举继承enum
所有枚举都自动继承java.lang.Enum
,定义了很多方法,可供所有枚举使用,下面介绍最为常用的两个。
final int ordinal() //返回枚举常量的顺序值
final int compareTo(enum-type e) //比较同一个枚举中两个枚举常量的顺序值
// Demonstrate ordinal() and compareTo().
// An enumeration of Transport varieties.
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT
}
class EnumDemo4 {
public static void main(String args[])
{
Transport tp, tp2, tp3;
// Obtain all ordinal values using ordinal().
System.out.println("Here are all Transport constants" +
" and their ordinal values: ");
for(Transport t : Transport.values())
System.out.println(t + " " + t.ordinal());
tp = Transport.AIRPLANE;
tp2 = Transport.TRAIN;
tp3 = Transport.AIRPLANE;
System.out.println();
// Demonstrate compareTo()
if(tp.compareTo(tp2) < 0)
System.out.println(tp + " comes before " + tp2);
if(tp.compareTo(tp2) > 0)
System.out.println(tp2 + " comes before " + tp);
if(tp.compareTo(tp3) == 0)
System.out.println(tp + " equals " + tp3);
}
}
为了加深理解,看一个更加具体使用的例子--使用计算机控制交通灯
// A simulation of a traffic light that uses
// an enumeration to describe the light's color.
// An enumeration of the colors of a traffic light.
enum TrafficLightColor {
RED, GREEN, YELLOW
}
// A computerized traffic light.
class TrafficLightSimulator implements Runnable {
private Thread thrd; // holds the thread that runs the simulation
private TrafficLightColor tlc; // holds the current traffic light color
boolean stop = false; // set to true to stop the simulation
boolean changed = false; // true when the light has changed
TrafficLightSimulator(TrafficLightColor init) {
tlc = init;
thrd = new Thread(this);
thrd.start();
}
TrafficLightSimulator() {
tlc = TrafficLightColor.RED;
thrd = new Thread(this);
thrd.start();
}
// Start up the light.
public void run() {
while(!stop) {
try {
switch(tlc) {
case GREEN:
Thread.sleep(10000); // green for 10 seconds
break;
case YELLOW:
Thread.sleep(2000); // yellow for 2 seconds
break;
case RED:
Thread.sleep(12000); // red for 12 seconds
break;
}
} catch(InterruptedException exc) {
System.out.println(exc);
}
changeColor();
}
}
// Change color.
synchronized void changeColor() {
switch(tlc) {
case RED:
tlc = TrafficLightColor.GREEN;
break;
case YELLOW:
tlc = TrafficLightColor.RED;
break;
case GREEN:
tlc = TrafficLightColor.YELLOW;
}
changed = true;
notify(); // signal that the light has changed
}
// Wait until a light change occurs.
synchronized void waitForChange() {
try {
while(!changed)
wait(); // wait for light to change
changed = false;
} catch(InterruptedException exc) {
System.out.println(exc);
}
}
// Return current color.
synchronized TrafficLightColor getColor() {
return tlc;
}
// Stop the traffic light.
synchronized void cancel() {
stop = true;
}
}
class TrafficLightDemo {
public static void main(String args[]) {
TrafficLightSimulator tl =
new TrafficLightSimulator(TrafficLightColor.GREEN);
for(int i=0; i < 9; i++) {
System.out.println(tl.getColor());
tl.waitForChange();
}
tl.cancel();
}
}
网友评论