枚举

  学了一段时间Java,总结一下到目前为止学到的枚举用法:

1)可以定义在包中、类中,但不能定义在方法中
2)枚举类型不能被继承
3)枚举类型默认继承java.lang.Enum
4)枚举类型的每个取值都是自己的一个实例对象
5)枚举类型可以有属性、方法、构造器
6)枚举类型可以实现接口
7)枚举类型有静态方法values()获取所有取值

package com.wsy.enumtest;
//enum在switch中的应用
//JDK1.5及之后的switch语句可以支持enum类型,使用枚举,能让我们的代码可读性更强。
enum Signal {
    GREEN, YELLOW, RED
}

public class TrafficLight {
    Signal color = Signal.GREEN;

    public void change() {
        switch (color) {
        case RED:
            color = Signal.GREEN;
            System.out.println(color);
            break;
        case YELLOW:
            color = Signal.RED;
            System.out.println(color);
            break;
        case GREEN:
            color = Signal.YELLOW;
            System.out.println(color);
            break;
        }
    }
    
    public static void main(String[] args) {
        TrafficLight trafficLight = new TrafficLight();
        trafficLight.change();
    }
}
package com.wsy.enumtest;
//enum实现接口
//所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。但可以实现接口。
//在JDK1.5 之前,我们定义常量都是: public static final…… .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
//例如:enum Color { RED, GREEN, BLANK, YELLOW }
interface Behaviour {
    void print();

    String getInfo();
}

public enum Color implements Behaviour {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    private Color(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // 接口方法
    @Override
    public String getInfo() {
        return this.name;
    }

    // 接口方法
    @Override
    public void print() {
        System.out.println(this.index + ":" + this.name);
    }

    // 覆盖方法
    @Override
    public String toString() {
        return this.index + "_" + this.name;
    }

    public static void main(String[] args) {
        RED.print();
        System.out.println(RED.getInfo());
        System.out.println(RED);
    }
}

  以下是用枚举做的随机发牌的一个小程序(因为牌的花色固定,大小固定,适合用枚举, 注:没有大小王):

package com.wsy.enumtest;

import java.util.ArrayList;
import java.util.List;

public class Card {
    public enum Rank{
        DEUCE,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE
    }
    public enum Suit{
        CLUBS,DIAMONDS,HEARTS,SPADES
    }
    
    private final Rank rank;
    private final Suit suit;
    private Card(Rank rank , Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }
    
    public Rank rank() {
        return rank;
    }
    
    public Suit suit() {
        return suit;
    }
    
    public String toString() {
        return rank + "of" + suit;
    }
    
    private static final List<Card> protoDeck = new ArrayList<Card>();
    
    static {
        for(Suit suit : Suit.values()) {
            for(Rank rank : Rank.values()) {
                protoDeck.add((new Card(rank , suit)));
                }
            }
    }
    
    public static ArrayList<Card> newDeck() {
        return new ArrayList<Card>(protoDeck);
    }
}


package com.wsy.enumtest;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Deal {
    public static void main(String[] args) {
        if(args.length != 2) {
            System.out.println("Usage:java" + Deal.class.getName() + "numHands cardPerHand");
            System.exit(1);
        }
        
        int numHands = Integer.parseInt(args[0]);
        int cardsPerHand = Integer.parseInt(args[1]);
        List<Card> deck = Card.newDeck();
        Collections.shuffle(deck);
        for(int i = 0; i < numHands; i++) {
            System.out.println(deal(deck , cardsPerHand));
        }
    }
    public static ArrayList<Card> deal(List<Card> deck , int n){
        int deckSize = deck.size();
        List<Card> handView = deck.subList(deckSize-n , deckSize);
        ArrayList<Card> hand = new ArrayList<Card> (handView);
        handView.clear();
        return hand;
    }
}

 EnumSet集合辅助使用enum类型:allOf()/range()/of()...

public enum Grade {
    A , B , C , D
}

import java.util.EnumSet;

public class EnumSetTest {
    public static void outEnumSet(EnumSet es) {
        for (Object o : es) {
            System.out.println(o);
        }
    }

    public static void main(String[] args) {
        //打印枚举中所有取值
        EnumSet es = EnumSet.allOf(Grade.class);
        outEnumSet(es);
        System.out.println("************");
        //打印枚举中的A到C
        es = EnumSet.range(Grade.A, Grade.C);
        outEnumSet(es);
        System.out.println("************");
        //打印枚举中的B和D
        es = EnumSet.of(Grade.B,Grade.D);
        outEnumSet(es);
        System.out.println("************");
        //输出枚举中的所有取值
        Grade[] grades = Grade.values();
        for(Object o : grades){
            System.out.println(o);
        }
    }
}

结果:
A
B
C
D
************
A
B
C
************
B
D
************
A
B
C
D

EnumMap集合辅助使用enum类型:

public enum Grade {
    A , B , C , D
}

import java.util.EnumMap;
import java.util.Map;

public class EnumMapTest {
    public static void main(String[] args) {
        EnumMap<Grade, String> em = new EnumMap<Grade, String>(Grade.class);
        em.put(Grade.A, "Excellent");
        em.put(Grade.B, "Good");
        em.put(Grade.C, "Passed");
        em.put(Grade.D, "Fail");

        for (Object o : em.entrySet()) {
            Map.Entry entry = (Map.Entry) o;
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(key + ":" + value);
        }
    }
}

结果:
A:Excellent
B:Good
C:Passed
D:Fail

 

posted @ 2017-09-02 12:00  渊源谭  阅读(190)  评论(0编辑  收藏  举报