enum

  1. 通过static final来定义常量
  2. enum
  3. switch与enum是黄金搭档

通过static final来定义常量

在Java中,我们可以通过static final来定义常量。例如,我们希望定义周一到周日这7个常量,可以用7个不同的int表示:

public class Weekday {
    public static final int SUN = 0;
    public static final int MON = 1;
    public static final int TUE = 2;
    public static final int WED = 3;
    public static final int THU = 4;
    public static final int FRI = 5;
    public static final int SAT = 6;
}

使用常量的时候,可以这么引用:

if (day == Weekday.SAT || day == Weekday.SUN) {
    // TODO: work at home
}

也可以把常量定义为字符串类型,例如,定义3种颜色的常量:

public class Color {
    public static final String RED = "r";
    public static final String GREEN = "g";
    public static final String BLUE = "b";
}

使用常量的时候,可以这么引用:

String color = ...
if (Color.RED.equals(color)) {
    // TODO:
}

字符串的比较都是比较组成字符串对象的每个字符是否相同,因此字符串的比较只会使用equals方法,不会使用==方法。

使用这些常量来表示一组枚举值的时候,有一个严重的问题就是,编译器无法检查每个值的合理性。比如我们定义一个颜色变量String color = ...,但是除了指向常量的三种颜色,也可以指向任意的字符串,但是颜色变量我们只希望用来存储三种颜色,与预期不符。

class Color {
    public static final String RED = "r";
    public static final String GREEN = "g";
    public static final String BLUE = "b";
}

public class Hello {
    public static void main(String[] args) {
        String color = Color.RED;
        System.out.println(color);

        color = "Hi Michael!";   //   r
        System.out.println(color);   //   Hi Michael!
    }
}

enum

像上面定义常量的方式,并不能实现颜色变量color指向的一定是颜色常量,日期变量day的取值也可以是任意整数,不好管理。所以就有了枚举。

不同用途的常量可以定义对应的枚举类,编译器能自动检查某个值在枚举的集合内,我们可以使用enum来定义枚举类:

enum Weekday {
    SUN, MON, TUE, WED, THU, FRI, SAT;
}

public class Hello {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        // 输出  Work at home!
        if (day == Weekday.SAT || day == Weekday.SUN) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }
}

switch与enum是黄金搭档

switch与enum是黄金搭档,使用switch语句的时候更适合传入enum参数,而不是int参数或String参数。

enum Weekday {
    SUN, MON, TUE, WED, THU, FRI, SAT;
}

public class Hello {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        switch(day) {
            case MON,TUE,WED,THU,FRI -> System.out.println("Today is " + day + ". Work at office!");
            case SAT,SUN -> System.out.println("Today is " + day + ". Work at home!");
            default-> throw new RuntimeException("cannot process " + day);
        }
    }
}

他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!

目录
×

喜欢就点赞,疼爱就打赏