Java 枚举

枚举是一种特殊的数据,它的取值是有限的,比如一年四季、一周七天。

枚举类型实际上会被 Java 编译器转换为一个对应的类,这个类继承了 java.lang.Enum 类,枚举是 final 的,不能被继承。

枚举类型本质上也是类,由于编译器自动做了很多事情,枚举的语法更为简洁,更为安全,一个枚举类型的变量,它的值要么为 null,要么为枚举值之一,不可能为其他值,但使用整型变量,它的值就没有办法强制,值可能就是无效的。

枚举定义

/**
 * 枚举使用 enum 这个关键字来定义
 */
public enum Size {
    // 值一般是大写的字母,多个值之间以逗号分隔
  	// 枚举值的定义需要放在最上面,枚举值写完之后,要以分号(; )结尾,然后才能写其他代码
    SMALL(1, "S", "小号"),
    MEDIUM(2, "M", "中号"),
    LARGE(3, "L", "大号");

    private int id;
    private String abbr;
    private String title;

    private Size(int id, String abbr, String title) {
        this.id = id;
        this.abbr = abbr;
        this.title = title;
    }

    public int getId() {
        return id;
    }

    public String getAbbr() {
        return abbr;
    }

    public String getTitle() {
        return title;
    }

    public static Size fromAbbr(String abbr){
        for (Size size : Size.values()){
            if(size.getAbbr().equals(abbr)){
                return size;
            }
        }
        return null;
    }
}

枚举可以包含抽象方法,如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。

enum Color {
    RED{
        public String getColor(){ // 枚举对象实现抽象方法
            return "红色";
        }
    },
    GREEN{
        public String getColor(){ // 枚举对象实现抽象方法
            return "绿色";
        }
    },
    BLUE{
        public String getColor(){ // 枚举对象实现抽象方法
            return "蓝色";
        }
    };
    public abstract String getColor(); // 定义抽象方法
}

public class Test{
    public static void main(String[] args) {
        for (Color c:Color.values()){
            System.out.print(c.getColor() + "、");
        }
    }
}

使用枚举

Size size = Size.SMALL;

枚举变量可以使用 equals 和 == 进行比较,结果是一样的。

枚举常用方法

public class TestUtil {

    public static void main(String[] args) {
        enumTest();
        onChose(Size.SMALL);
        enumTestTwo();
    }

    public static void enumTest(){
        Size sSize = Size.SMALL;
        Size mSize = Size.MEDIUM;
        Size lSize = Size.LARGE;

        System.out.println(mSize.toString()); // toString 方法返回其字面值 MEDIUM
        System.out.println(mSize.name()); // name()方法,返回值与toString()一样 MEDIUM
        System.out.println(mSize.ordinal()); // ordinal()表示枚举值在声明时的顺序,从0开始
        System.out.println(sSize.compareTo(lSize)); // 其实就是比较ordinal的大小
        // 枚举变量可以使用equals和==进行比较,结果是一样的
        System.out.println(Size.MEDIUM==mSize);
        System.out.println(Size.MEDIUM.equals(mSize)); 
        
        System.out.println(Size.valueOf("LARGE").name()); // valueOf 返回字符串对应的枚举值
        for (Size size : Size.values()) { // values 返回一个包括所有枚举值的数组
        }
    }

    public static void onChose(Size size){
        // 在switch语句内部,枚举值不能带枚举类型前缀,枚举值会被转换为其对应的 ordinal 值
        switch (size) {
            case SMALL:
                System.out.println("chose small");
                break;
            case MEDIUM:
                System.out.println("chose medium");
            case LARGE:
                System.out.println("chose large");
        }
    }

    public static void enumTestTwo(){
        Size s = Size.SMALL;
        Size m = Size.MEDIUM;
        Size l = Size.fromAbbr("L");
        System.out.println(s.getId());
        System.out.println(m.getAbbr());
        System.out.println(l.getTitle());
    }
}

参考:《Java 编程的逻辑》 马俊昌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值