菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
187
0

java 枚举

原创
05/13 14:22
阅读数 22607

枚举是一种特殊的数据,它的取值是有限的,是可以枚举出来的,比如一年有四季、一周有七天。虽然使用类也可以处理这种数据,但枚举类型更为简洁、安全和方便。

 

枚举的好处体现在以下几方面。

  • 定义枚举的语法更为简洁。
  • 枚举更为安全。一个枚举类型的变量,它的值要么为null,要么为枚举值之一,不可能为其他值,但使用整型变量,它的值就没有办法强制,值可能就是无效的。
  • 枚举类型自带很多便利方法(如values、valueOf、toString等),易于使用。

 

基础使用:

public enum Size {
    SMALL, MEDIUM, LARGE
}

 

public class Main_5_4_1 {

    public static void main(String[] args) {

        // 使用Size
        Size size = Size.MEDIUM;

        Size size = Size.SMALL;
        // 枚举变量的toString方法返回其字面值,所有枚举类型也都有一个name()方法,返回值与toString()一样
        System.out.println(size.toString()); // SMALL
        System.out.println(size.name()); // SMALL

        Size size = Size.SMALL;
        // 枚举变量可以使用equals和==进行比较,结果是一样的
        System.out.println(size == Size.SMALL); // true
        System.out.println(size.equals(Size.SMALL));// true
        System.out.println(size == Size.MEDIUM);// false

        Size size = Size.MEDIUM;
        // 枚举值是有顺序的,可以比较大小。枚举类型都有一个方法int or-dinal(),表示枚举值在声明时的顺序,从0开始
        System.out.println(size.ordinal()); // 1

        Size size = Size.SMALL;
        // 枚举类型都实现了Java API中的Comparable接口,都可以通过方法compareTo与其他枚举值进行比较。比较其实就是比较ordinal的大小
        System.out.println(size.compareTo(Size.MEDIUM)); // -1

        // 枚举还可以用于switch语句
        onChosen(Size.MEDIUM);

        // 枚举类型都有一个静态的valueOf(String)方法,可以返回字符串对应的枚举值
        System.out.println(Size.SMALL==Size.valueOf("SMALL")); // true

        // 枚举类型也都有一个静态的values方法,返回一个包括所有枚举值的数组,顺序与声明时的顺序一致
        for (Size size : Size.values()) {
            System.out.println(size); // 输出为三行,分别是SMALL、MEDIUM、LARGE。
        }

    }

    static void onChosen(Size size) {
        switch (size) {
            case SMALL:
                System.out.println("chosen small");
                break;
            case MEDIUM:
                System.out.println("chosen medium");
                break;
            case LARGE:
                System.out.println("chosen large");
                break;
        }
    }
}

 

典型场景:

/**
 * Created by xc on 2019/11/17
 * 代码清单5-13 带有实例变量和方法的枚举类Size
 */
public enum Size {

    // 枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。
    SMALL("S", "小号"), MEDIUM("M", "中号"), LARGE("L", "大号");

    /**
     * 缩写
     */
    private String abbr;
    /**
     * 中文名称
     */
    private String title;

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

    public String getAbbr() {
        return abbr;
    }

    public String getTitle() {
        return title;
    }

    /**
     * 根据缩写返回对应的枚举值。
     *
     * @param abbr 缩写
     * @return
     */
    public static Size fromAbbr(String abbr) {
        for (Size size : Size.values()) {
            if (size.getAbbr().equals(abbr)) {
                return size;
            }
        }
        return null;
    }
}

 

上述代码定义了两个实例变量abbr和title,以及对应的get方法,分别表示缩写和中文名称;定义了一个私有构造方法,接受缩写和中文名称,每个枚举值在定义的时候都传递了对应的值;同时定义了一个静态方法fromAbbr,根据缩写返回对应的枚举值。需要说明的是,枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。这个枚举定义的使用与其他类类似,比如:

public class Main_5_4_2 {

    public static void main(String[] args) {
        Size s = Size.MEDIUM;
        System.out.println(s.getAbbr()); //输出M
        s = Size.fromAbbr("L");
        System.out.println(s.getTitle()); //输出“大号”
    }

}

 

参考:java编程逻辑5.4

发表评论

0/200
187 点赞
0 评论
收藏