枚举类你真的会吗?

在这里插入图片描述

在java5增加了一个enum关键字,用来定义枚举类,相信好多的小伙伴学习java很久了,但是对于枚举类是空白的,只知道有这么个东西,奶奶不疼舅舅不爱的,对于使用更是没有应用过,相信下面的demo你一定会对枚举产生很大的兴趣,这个兄弟可以灰常的方便以及实现的!

使用枚举类会默认使用finala修改,枚举类不能派生子类。

  • 代码时间
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    enum SeasonEnum{
    //定义四个实例,春,夏,秋,冬
    SPRING,SUMMER,FALL,WINTER;
    }

    public class JudgeTest {
    public void judge(SeasonEnum s){
    //swith语句里的表达式可以为枚举值
    switch (s)
    {
    case SPRING:
    System.out.println("春天到了,又到了动物交配的季节!");
    break;
    case SUMMER:
    System.out.println("夏天,小青蛙呱呱叫");
    break;
    case FALL:
    System.out.println("秋天,是个分手的好季节");
    break;
    case WINTER:
    System.out.println("老婆孩子热炕头ing");
    break;
    }
    }
    }

    public class EnumTest {
    public static void main(String[] args) {

    //打印枚举类型中的所有实例
    for (SeasonEnum s : SeasonEnum.values()) {
    System.out.println(s);
    }
    System.out.println();
    //传入指定的实例,输出方法中符合条件的结果
    new JudgeTest().judge(SeasonEnum.SPRING);
    }
    }
  • 运行结果

在这里插入图片描述
在java中对象之间判断是否相等常用的是equalse,在枚举中使用的是“==”

1
2
3
4
5
6
7
8
9
10
11
public class EnumTest {
public static void main(String[] args) {

SeasonEnum spring = SeasonEnum.SPRING;
if (spring == SeasonEnum.WINTER){
System.out.println("输入的值存在");
}else {
System.out.println("值不存在!");
}
}
}

java.lang.Enum类中的其他方法:

(1)int compareTo(E o):
用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数,如果位置指定枚举对象之前,则返回负整数,否则返回零。
(2)String name():
返回此枚举实例的名称,这个名称就是定义枚举类时列出的所有枚举值之一,不过大多数情况下使用的toString方法,此方法返回的结果更加友好。
(3)int ordinal():
返回枚举值在枚举类中的索引值(就是枚举值在枚举声明 中的位置,枚举值 的索引 从0开始)。

枚举类的成员变量、方法和构造器

  • 代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class GenderTest {
    public static void main(String[] args) {
    //通过Enum中的valueOf方法来获取指定枚举类的枚举值
    Gender g = Enum.valueOf(Gender.class, "FEMALE");
    //设置值
    g.name="女";
    System.out.println(g+"代表:"+g.name);
    }
    }

    enum Gender{
    MALE,FEMALE;
    public String name;
    }
    在这样的情况下,是正常的,如果将g.name=”男”设置为男,那么整个逻辑就特别的混乱,我们可不可以直接 将枚举中的值 给它指定好,使用者不能改变,那我们来试试
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public enum Gender {
    MALE,FEMALE;
    private String name;
    public void setName(String name){
    switch (this)
    {
    case MALE:
    if (name.equals("男")) {
    this.name = name;
    }else{
    System.out.println("参数错误");
    return ;
    }
    break;
    case FEMALE:
    if (name.equals("女")) {
    this.name = name;
    }else{
    System.out.println("参数错误");
    return ;
    }
    break;
    }
    }

    public String getName() {
    return this.name;
    }
    }

    public class GenderTest {
    public static void main(String[] args) {
    Gender g = Gender.valueOf("FEMALE");
    g.setName("女");
    System.out.println(g+"代表:"+g.getName());
    g.setName("男");
    System.out.println(g+"代表:"+g.getName());
    }
    }
    • 运行结果
      在这里插入图片描述
      第一次运行正确,但是我们如果设置姓名为男时,还是不行,因为第第一次初始化时已经设置为女再设置就会报错。那么这种方式还是得修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public enum Gender {

MALE("男"),FEMALE("女");
private String name;

private Gender(String name) {
this.name = name;
}

public String getName() {
return this.name;
}
}

public class GenderTest {
public static void main(String[] args) {
Gender g = Gender.valueOf("FEMALE");
System.out.println(g.getName());
}
}
  • 结果
    在这里插入图片描述

注意:

在给枚举类中的值MALE(“男”),FEMALE(“女”);进行初始化时,一定要有有参构造方法,才能给值赋值,并且构造方法只能使用private来修饰,这样我们就可以实现不修改代码,并且值 是不会改变的!

总结:在枚举类型中,非抽象的枚举类才默认使用final修改!