java枚举类

enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式。

 
枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。
枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。
 
必须在枚举类的第一行声明枚举类对象。
枚举类和普通类的区别:
       1.使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
       2.枚举类的构造器只能使用 private 访问控制符
       3.枚举类的所有实例必须在枚举类中显式列出(以,分隔 以; 结尾). 列出的实例系统会自动添加 public static final 修饰
 
JDK1.5之前需要自定义枚举类:
 
/*枚举类的自定义方式*/
public class TestSeason {
    public static void main(String[] args){
         Season spring=Season.SPRING;
         System.out.println(spring);
         System.out.println(spring.getSeasonName());
    }
}
//枚举类
class Season{
    //1.提供类的属性,声明为private final
    private final String seasonName;
    private final String seasonDesc;
    //2.声明为final的属性,在构造器中初始化
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
 
    public static final Season SPRING=new Season("spring","春暖花开");
    public static final Season SUMMER=new Season("summer","夏日炎炎");
    public static final Season AUTOMN=new Season("automn","秋高气爽");
    public static final Season WINTER=new Season("winter","白雪皑皑");
    
    //通过公共的方法来调用属性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc="
                + seasonDesc + "]";
    }
}  
JDK 1.5 新增的 enum 关键字用于定义枚举类:
     枚举类的主要方法:
         1.values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
         2.valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
     若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法
/*
 * 一.枚举类
 * 1.如何自定义枚举类
 * 2.如何使用enum关键字定义枚举类
 *      常用的方法;values(),valueOf(String str)
 *      如何使枚举类实现接口:可以让不同的枚举类的对象调用被重写的抽象方法,执行的效果不同(相当于每个对象重写抽象方法)
 * */

public class TestSeason1{
    public static void main(String[] args){
        SeasonEnum spring=SeasonEnum.SPRING;
        System.out.println(spring);
        System.out.println(spring.getSeasonName());
        
        //1.values方法可以返回枚举类型的对象数组,可以方便遍历所有的枚举值
        SeasonEnum[] seasons=SeasonEnum.values();
        for(int i=0;i<seasons.length;i++){
            System.out.println(seasons[i]);
        }
        //2.valueOf方法可以把一个字符串转为对应的枚举类对象,要求字符串必须是枚举类对象的“名字”
        String str="WINTER";
        SeasonEnum sea=SeasonEnum.valueOf(str);
        System.out.println(sea);
        //不同的枚举类对象调用重写的show方法得到不同的效果
        spring.show();
        sea.show();
        
    }
}
//接口
interface Info{
    public void show();
}
//实现接口的枚举类
enum SeasonEnum implements Info{
     //必须在枚举类的第一行声明枚举类对象
    SPRING("spring","春暖花开"){
        public void show(){
            System.out.println("春天在哪里");
        }
    },
    SUMMER("summer","夏日炎炎"){
        public void show(){
            System.out.println("生如夏花");
        }
    },
    AUTOMN("autumn","秋高气爽"){
        public void show(){
            System.out.println("金色的秋天");
        }
    },
    WINTER("winter","白雪皑皑"){
        public void show(){
            System.out.println("冬天里的一把火");
        }
    };
    
    private final String seasonName;
    private final String seasonDesc;
    
    private SeasonEnum(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    public String getSeasonName() {
        return seasonName;
    }
    
    public String getSeasonDesc() {
        return seasonDesc;
    }
}
原文地址:https://www.cnblogs.com/xujiming/p/4638494.html