Enum的简单了解

Enum可以将一组具名的有限集合创建成一种新的类型,而这些具名的值可以作为常规的程序组件使用。

在创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum,所以enum本身也是一个类。

package myenums;

public enum Color {
	RED,
	ORANGE,
	YELLOW,
	GREEN,
	BLUE,
	PURPLE
}

package myenums;

public enum Day {
    	SUNDAY, 
	MONDAY, 
	TUESDAY, 
	WEDNESDAY,
    	THURSDAY, 
	FRIDAY, 
	SATURDAY 
}

enum中所有的枚举值,都是这个类静态常量。

可以使用==来比较enum实例,编译器会自动为你提供equals和hashCode方法。

package me.benzeph.myenums;

import org.junit.Test;

import static myenums.Color.BLUE;
import static myenums.Color.RED;
import static myenums.Day.MONDAY;
import static myenums.Day.THURSDAY;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;

public class MyEnumTest {
	@Test
	public void shouldReturnTrue() {
		assertFalse(MONDAY == THURSDAY);
		assertFalse(BLUE == RED);
		assertThat(BLUE, is(BLUE));
	}
}

除了不能继承一个enum,基本可以将enum看做一个常规的类。

如果打算在enum中定义自己的方法,必须在enum实例序列的最后添加一个分号,同时必须先定义一个enum实例(在方法之前)。

package myenums;

public enum Color {
	RED("red"),
	ORANGE("orange"),
	YELLOW("yellow"),
	GREEN("green"),
	BLUE("blue"),
	PURPLE("purple");
	String value;

	private Color(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}
}
在switch中使用enum,是enum提供的一个非常方便的功能。

package me.benzeph.myenums;

import myenums.Color;
import org.junit.Test;

import static myenums.Color.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class MyEnumTest {
	@Test
	public void shouldReturnBlue() {
		assertThat(choose(BLUE), is("blue"));
	}

	private String choose(Color color) {
		String value;
		switch (color) {
			case RED:
				value = RED.getValue();
				break;
			case GREEN:
				value = GREEN.getValue();
				break;
			case BLUE:
				value = BLUE.getValue();
				break;
			default:
				value = "colorful";
		}
		return value;
	}
}

values()方法,可以得到enum中所有元素的数组。

package me.benzeph.myenums;

import myenums.Color;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class MyEnumTest {
	@Test
	public void shouldReturn6() {
		assertThat(Color.values().length, is(6));
	}
}

如果你研究一下父类Enum,你会发现它并没有values()方法。

values()方法是由编译器添加的static方法。

参考文献:

《Thinking In Java》

http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html

http://softbeta.iteye.com/blog/1185573




你可能感兴趣的:(Enum的简单了解)