您的位置:首页 > 职场人生

黑马程序员_基础加强(2) 枚举

2013-03-18 00:03 337 查看
------- android培训java培训、期待与您交流!
----------

一.普通类实现枚举

私有构造方法。

每个元素分别用一个公有的静态成员变量来表示。

可以有若干公有方法或抽象方法

eg:

public abstract class WeekDay1{
private WeekDay1(){}
public final static WeekDay1 SUN = new WeekDay1(){
//采用抽象方法就是将if else语句转移一个个独立的类
public  WeekDay1 nextDay()
{
return MON;
}
};
public final static WeekDay1 MON = new WeekDay1(){
public  WeekDay1 nextDay()
{
return TUES;
}
};
public final static WeekDay1 TUES = new WeekDay1(){
public  WeekDay1 nextDay()
{
return WES;
}
};
public final static WeekDay1 WES = new WeekDay1(){
public  WeekDay1 nextDay()
{
return THUR;
}
};
public final static WeekDay1 THUR = new WeekDay1(){
public  WeekDay1 nextDay()
{
return FRI;
}
};
public final static WeekDay1 FRI = new WeekDay1(){
public  WeekDay1 nextDay()
{
return SAT;
}
};
public final static WeekDay1 SAT = new WeekDay1(){
public  WeekDay1 nextDay()
{
return SUN;
}
};

public abstract WeekDay1 nextDay();

public String toString()
{
if(this == MON){
return "MON";
}else if(this == TUES){
return "TUES";
}else if(this == WES){
return "WES";
}else if(this == THUR){
return "THUR";
}else if(this == FRI){
return "FRI";
}else if(this == SAT){
return "SAT";
}else{
return "SUN";
}
}
}
枚举的应用:

eg:

public enum TrafficLamp{
//下边的一个代码,可以看出TrafficLamp子类   的一个对象,对象名是RED,子类名未知。
RED(30){
public  TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public  TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(15){
public  TrafficLamp nextLamp(){
return RED;
}
};

public abstract TrafficLamp nextLamp();
@SuppressWarnings("unused")
private int time;
private TrafficLamp(int time){this.time =time;}
}


二.枚举的用法

静态的枚举引用

switch语句中的枚举

eg:

enum Traffic {
GREEN, YELLOW, RED,
}
class TrafficLight{
Traffic color = Traffic.RED;

public  void changeLight(){
switch(color){
case RED: color=Traffic.GREEN;
break;
case GREEN: color=Traffic.YELLOW;
break;
case YELLOW: color=Traffic.RED;
break;
}
}

public String toString(){
return "the Traffic light is "+color;
}

public static void main(String[] args) throws InterruptedException{
TrafficLight trafficLight = new TrafficLight();
while(true){
System.out.println(trafficLight);
Thread.sleep(2*1000);
trafficLight.changeLight();
}
}
}


通过一个接口或多个接口创建枚举:

eg

package com.java;
import java.util.Random;
interface Generators<T>{
public T next();
}

enum EnumElement implements Generators<EnumElement>{
A,B,C,D,E;

private Random random = new Random(47);
@Override
public EnumElement next() {
return values()[random.nextInt(values().length)];
}
}
class EnumTest{
public static <T> void getElements(Generators<T> t){
System.out.println(t.next());
}

public static void main(String[] args){
for(int i=0;i<EnumElement.values().length;i++)
getElements(EnumElement.A);
}
}
枚举随机抽取

eg:

package com.java;
import java.util.*;
public class Enums {
private static Random rand =  new Random(47);
public static <T> T random(T[] values){
return values[rand.nextInt(values.length)];
}
public static <T extends Enum<T>> T random(Class<T> enumClass){
return random(enumClass.getEnumConstants());
}

public static void toB(long number){
if(number>>>1!=0)
toB(number>>>1);
System.out.print(number & 1);

}
public static void main(String[] args){
toB(10);
System.out.println(5.0942*1000);
System.out.println(5.0943f*1000);
System.out.println(5.0944f*1000);
}
}
接口组织多个枚举

package com.java;
/**
* 接口组织枚举,对枚举进行扩展
* @author Administrator
*
*/
public interface Food {

enum Appetizer implements Food{
SALAD,SOUP,SPRING_ROLLS;
}

enum Maincourse implements Food{
LASAGNE, BURRITO, PAD_THAI,LENTILS, HUMMOUS, VINDALOO;
}

enum Dessert implements Food{
TIRAMISU, GELATO, BLACK_FOREST_CAKE,FRUIT, CREME_CARAMEL;
}

enum Coffee implements Food{
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO,LATTE, CAPPUCCINO, TEA, HERB_TEA;
}

}
枚举定义接口的实现

package com.java;
import com.java.Food.Appetizer;
import com.java.Food.Maincourse;
public class TypeOfFood {
public static void main(String[] args) {
Food food = Appetizer.SALAD;
food = Maincourse.HUMMOUS;
System.out.println(food);
}
}
枚举里存放枚举实例

package com.java;
import java.lang.reflect.InvocationTargetException;
@SuppressWarnings("unused")
public enum Course {
APPETIZERD(Food.Appetizer.class),
MAINCOURSE(Food.Maincourse.class),
DESSERT(Food.Dessert.class),
COFFEE(Food.Coffee.class);
private Food[] values;
private Course(Class<? extends Food> foodClass){
values=foodClass.getEnumConstants();
}
public Food randomSelection(){
return Enums.random(values);
}
public String toString(){
return Enums.random(values).toString();
}

public static void main(String[] args){
for(int i=0;i<Course.values().length;i++){
for(Course course : Course.values()){
Food food = course.randomSelection();
System.out.println(food);
}
System.out.println("---------");
}

/*
Course course = Course.APPETIZERD;
while(true){
try {
Food food = (Food) Course.class.getMethod("randomSelection").invoke(course);
System.out.println(food);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException
| SecurityException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}
*/
}
}
加紧奏的实现方法

eg:

package com.java;

enum SecurityCategory{

STOCK(Security.Stock.class),BOND(Security.Bond.class);
private Security[] values;
private SecurityCategory(Class<? extends Security> enumClass){
values =  enumClass.getEnumConstants();
}

interface Security{

enum Stock implements Security{
SHORT,LONG,MARGIN;
}

enum Bond implements Security{
MUNICIPAL,JUNK;
}
}

public Security randomSelection(){
return Enums.random(values);
}

public static void main(String[] args) throws InterruptedException{
/*
while(true){
Thread.sleep(5000);
for(SecurityCategory securityCategory : SecurityCategory.values()){
Security security = securityCategory.randomSelection();
System.out.println(security.toString());
}
System.out.println("-------------------");
}
*/
for(int i=0;i<10;i++){
SecurityCategory category = Enums.random(SecurityCategory.class);
System.out.println(category+":"+category.randomSelection());
}
}
}
JDK1.5提供了EnumSet 用法

eg:

package com.java;
public enum AlarmPoints {

STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,OFFICE4, BATHROOM, UTILITY, KITCHEN
}


package com.java;
import static com.java.AlarmPoints.*;
import java.util.*;
public class EnumSets {
public static void main(String[] args) {
EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class);
points.add(BATHROOM);
System.out.println(points);
points.addAll(EnumSet.of(STAIR1,STAIR2,KITCHEN));
System.out.println(points);
points = EnumSet.allOf(AlarmPoints.class);
points.removeAll(EnumSet.of(STAIR1,STAIR2,KITCHEN));
System.out.println(points);
points.removeAll(EnumSet.range(OFFICE1,OFFICE4));
System.out.println(points);
points=EnumSet.complementOf(points);
System.out.println(points);
}
}


EnumMap 用法

eg:

package com.java;
import java.util.*;
import java.util.Map.Entry;
public class EnumMaps {
interface Command {
void action();
}
enum AlarmPoint {
STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,OFFICE4, BATHROOM, UTILITY, KITCHEN
}
public static void main(String[] args){
EnumMap<AlarmPoint,Command> en = new EnumMap<AlarmPoint,Command>(AlarmPoint.class);

en.put(AlarmPoint.KITCHEN,new Command(){
public void action(){
System.out.println("Kithchen fire!");
}
});
en.put(AlarmPoint.BATHROOM,new Command(){
public void action(){
System.out.println("Bathroot alert!");
}
});

for(Map.Entry<AlarmPoint,Command> element : en.entrySet()){
System.out.print(element.getKey()+"---->");
element.getValue().action();
}
}
}


------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: