Java枚举类型小结

Java枚举类型小结

Java5 中引入了一个新的关键字——enum。我们可以利用enum来创建枚举。Java中的枚举也是一种类。它可以有自己的成员变量、方法,也可以实现接口、定义自己的构造器。同其他类一样,每个Java原文件中只能定义一个public访问权限的枚举类,且此public枚举类名需和Java源文件名相同。

枚举类和其他类的不同点

  • 不能显示继承其他父类
    • enum定义的枚举类默认继承了java.lang.Enum类,由于Java不支持多重继承,因此不可显式继承它者。
  • 默认实现了Serilizable和Comparable接口
  • 默认会被final修饰,无法派生子类
    • 注意:如果枚举类中含有抽象方法,则它就会被修饰为abstract而非final了
  • 构造器必须为private
    • 缺省状态下为private
    • 如果显式执行,也只能指定为private
      • 这也是为何枚举类型变量无法在外部new出来,而只能引用已有者的缘故
  • 所有实例必须在第一行显示列出,否则它将永远无法产生实例
  • 实例会被自动修饰为”public static final”

枚举类的定义

private enum Gender{
    MALE,FEMALE;
}

可为其添加成员变量:

private enum Gender{
    MALE,FEMALE;
    public String name;
}

可为其添加方法。如本例,可添加一个setter && getter 以增强封装性:

private enum Gender {
    MALE, FEMALE;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (this == MALE && name.equals("man")
                || this == FEMALE && name.equals("woman")) {
            this.name = name;
        } else {
            System.out.println("parms ERROR");
        }
    }
}

可为其添加构造器。如本例,可利用构造器增加枚举类的不可变性:

private enum Gender{
    MALE("man"), FEMALE("female");
    private final String name;
    Gender(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
}

可让其实现接口。

public class Main {

    private interface ShowInfo{
        void showInfo();
    }

    private enum Gender implements ShowInfo {
        MALE("man"), FEMALE("female");
        private final String name;

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

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

        @Override
        public void showInfo() {
            System.out.println("This is enum Gender");
        }

    }

    public static void main(String[] args) {
        Gender.MALE.showInfo();
        Gender.FEMALE.showInfo();
    }

}

读者会发现,这样实现接口的话,执行结果是与实例无关的。如果我们想让不同实例表现出不同结果,那么可以这样实现此接口:

private enum Gender implements ShowInfo {
    MALE("man") {
        @Override
        public void showInfo() {
            System.out.println("This is MALE");
        }
    },
    FEMALE("female") {
        @Override
        public void showInfo() {
            System.out.println("This is FEMALE");
        }
    };

    private final String name;

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

我们可将其与匿名内部类的语法格式相比较,实例后的花括号就是类体,MALE&&FEMALE实例就是Gender子类的实例,在此类体中实现接口就可以将接口的行为同实例关联起来。编译上面代码将生成Gender.class、Gender 1.classGender 2.class三个文件,这也印证了上面的结论。

还可为枚举类添加抽象方法:

enum CONST {
    A {
        @Override
        public void showName() {
            System.out.println("This is A");
        }
    },
    B {
        @Override
        public void showName() {
            System.out.println("This is B");
        }
    };

    public abstract void showName();
}

A和B依旧为CONST类的子类。由于含有抽象方法,因此此枚举类不再修饰为final,而是直接修饰为abstract,因此可以派生子类。

枚举的使用

判别

枚举类的元素常常用于表示一种符号,一种常量。那么最常见的使用就是对其进行判断了。样例如下:

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        // 枚举变量是不能被new出来,只能引用枚举集合中存在的元素
        Gender myGender = Gender.FEMALE;
        if (myGender.equals(Gender.MALE)) { // 判别直接用 == 也可
            System.out.println("MAN");
        }
        else {
            System.out.println("FEMALE");
        }
    }
}

当然,除了if外,还可以用switch,尤其是在枚举元素较多的情况下适用。

遍历

枚举类自带有values()方法,可以用于元素的遍历

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        for(Gender elem : Gender.values()){
            System.out.println(elem);
        }
    }
}

这个values方法实际上返回的是个数组,因此有关数组的使用(比如用length来获取元素个数),对本方法也是有效的。

获取元素索引

利用自带的ordinal()方法即可返回某元素于枚举集合中的位置(从0开始)

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        System.out.println(Gender.FEMALE.ordinal()); // 输出:1
    }
}

利用已实现的Comparable接口

Enum把此接口实现为用于判断两元素位置先后,看源码不难发现,实际上返回的就是self.ordinal - other.ordinal。看个样例:

public class Main {

    private enum ALPHABET {
        A, B, C, D, E;
    }

    public static void main(String[] args) {
        System.out.println(ALPHABET.A.compareTo(ALPHABET.B));//-1
        System.out.println(ALPHABET.B.compareTo(ALPHABET.B));//0
        System.out.println(ALPHABET.C.compareTo(ALPHABET.B));//1
    }
}

前者为负,后者为正,相同位置者为零。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值