ENUM使用与详解

全篇

Enum的使用很方便,之前想写一篇一直拖到现在,话不多说直接上代码
先贴全篇,可以直接down下来跑,全篇后是详解


package com.example.demo.st.setEnum;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

/**
 * Personnel class
 *
 * @author TransientBa
 * @date 2018/2/28
 */
public enum Personnel {
    小明("男",21,86),
    小红("女",22,55){
        @Override
        public boolean isPass(){
            return false;
        }
    },
    小蓝("男",23,73);
    private String sex;
    private int age;
    private int result;
    /* 构造 */
    private Personnel(String sex,int age,int result){
        this.sex = sex;
        this.age = age;
        this.result = result;
    }

    @Override
    public String toString() {
        return this.name()+"  性别:"+this.getSex() + "  年龄:"+this.getAge()+"  成绩为:"+this.getResult();
    }

    /**
     * 调出简介
     *
     * @return
     */
    public String callResume(){
        Personnel personnel = this;
        switch (personnel){
            case 小明:
                System.out.println(this.name()+"的简介为:");
                System.out.println(this.toString());
                System.out.println("是否通过了考试: "+this.isPass());
                break;
            case 小红:
                System.out.println(this.name()+"的简介为:");
                System.out.println(this.toString());
                System.out.println("是否通过了考试: "+this.isPass());
                break;
            default:
                System.out.println(this.name()+"的简介为:");
                System.out.println(this.toString());
                System.out.println("是否通过了考试: "+this.isPass());
                break;
        }
        System.out.println("--- --- --- --- --- --- ---");
        return "";
    }

    /**
     * 比较成绩
     * @param otherPersonnel
     * @return
     */
    public String compareResult(Personnel otherPersonnel){
        int pr1 = this.getResult();
        int pr2 = otherPersonnel.getResult();
        String pn1 = this.name();
        String pn2 = otherPersonnel.name();
        return pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同");
    }

    public String compareStudentNumber(Personnel personnel){
        String pn1 = this.name();
        String pn2 = personnel.name();
        String tipStuNumber = "";
        //compareTo返回负整数(小于) 零(登录) 正整数(大于)  由 pn1.ordinal - pn2.ordinal产生
        if(this.compareTo(personnel) >0){
            tipStuNumber = pn1+"的学号在"+pn2+"之后";
        }else if(this.compareTo(personnel) < 0){
            tipStuNumber = pn1+"的学号在"+pn2+"之前";
        }else {
            tipStuNumber = "两个人的学号相同";
        }
        return pn1+"的学号为:"+((int)this.ordinal()+1)+"   "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber;
    }

    public static void main(String[] args) {
//        for(Personnel personnel:Personnel.values()){
//                    System.out.println(personnel.name()+"的简介为:");
//                    System.out.println(personnel.toString());
//                    System.out.println("是否通过了考试:" + personnel.isPass());
//            System.out.println("----------------------");
//        }
        Personnel.小明.callResume();
        System.out.println(Personnel.小红.compareResult(Personnel.小明));
        System.out.println(Personnel.小明.compareStudentNumber(Personnel.小蓝));
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isPass(){
        return true;
    }

    public int getResult() {
        return result;
    }

    public void setResult(int result) {
        this.result = result;
    }
}

定义

public enum Personnel {
    小明,小红,小蓝;
}
//扩展一下
public enum Personnel {
    小明("男",21,86),
    小红("女",22,55),
    小蓝("男",23,73);
    private String sex;
    private int age;
    private int result;
}
//在扩展一下  重写小红的isPass方法  重写下toString  并带上构造   getset不贴了
public enum Personnel {
    小明("男",21,86),
    小红("女",22,55){
        @Override
        public boolean isPass(){
            return false;
        }
    },
    小蓝("男",23,73);
    private String sex;
    private int age;
    private int result;
    /* 构造 */
    private Personnel(String sex,int age,int result){
        this.sex = sex;
        this.age = age;
        this.result = result;
    }
    @Override
    public String toString() {
        return this.name()+"  性别:"+this.getSex() + "  年龄:"+this.getAge()+"  成绩为:"+this.getResult();
    }

}

ordinal 与 compareTo

ordinal :
返回所在位置 例如 Personnel.小明 .ordinal();

compareTo :
比较两个enum定义时的位置 返回值为this.ordinal - other.ordinal

public String compareStudentNumber(Personnel personnel){
        String pn1 = this.name();
        String pn2 = personnel.name();
        String tipStuNumber = "";
        //compareTo返回负整数(小于) 零(登录) 正整数(大于)  由 pn1.ordinal - pn2.ordinal产生
        if(this.compareTo(personnel) >0){
            tipStuNumber = pn1+"的学号在"+pn2+"之后";
        }else if(this.compareTo(personnel) < 0){
            tipStuNumber = pn1+"的学号在"+pn2+"之前";
        }else {
            tipStuNumber = "两个人的学号相同";
        }
        return pn1+"的学号为:"+((int)this.ordinal()+1)+"   "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber;
    }

1.8中源码为

 public final int compareTo(E o) {
        Enum> other = (Enum>)o;
        Enum self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

getDeclaringClass

Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
以上面的代码为例

System.out.println(Personnel.小明.getDeclaringClass());

返回值为

ENUM使用与详解_第1张图片

name 与 values

name返回当前定义的枚举名
values返回所有的枚举值

        for(Personnel personnel:Personnel.values()){
                    System.out.println(personnel.name()+"的简介为:");
                    System.out.println(personnel.toString());
                    System.out.println("是否通过了考试:" + personnel.isPass());
            System.out.println("----------------------");
        }

结果为:

ENUM使用与详解_第2张图片

注意

说句题外话,注意全篇中的compareResult方法与compareStudentNumber方法,在compareResult返回的三元中,并不等同于compareStudentNumber中的if else 实际等同如下

pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同");

等价于
if(pr1 > pr2){
    //....
}else{
    if(pr1 < pr2){
        //...
    }else{
        //...
    }
}

区别在于并不并列
if(){
    //...
}else if(){
    //...
}else{
    //...
}

总结

enum也同其他一样可理解为一个类,不同的为enum不能使用extends继承其他类。

你可能感兴趣的:(枚举)