Java枚举常数比体

示例

在一个enum有可能定义的一个特定常数的特定的行为enum,其覆盖的默认行为enum,这种技术被称为恒定特定身体

假设在enumnamed中定义了三个钢琴学生-John,Ben和Luke-PianoClass如下:

    enum PianoClass {
    JOHN, BEN, LUKE;
        public String getSex() {
            return "Male";
        }
        public String getLevel() {
            return "Beginner";
        }
    }

有一天,另外两名学生-丽塔(Rita)和汤姆(Tom)-性别(女性)和水平(中级)与以前的不匹配:

    enum PianoClass2 {
    JOHN, BEN, LUKE, RITA, TOM;
        public String getSex() {
            return "Male"; // 问题,丽塔是女性
        }
        public String getLevel() {
            return "Beginner"; // 问题,汤姆是中学生
        }
    }

因此,将新学生简单地添加到常量声明中,如下所示是不正确的:

PianoClass2 tom = PianoClass2.TOM;
PianoClass2 rita = PianoClass2.RITA;
System.out.println(tom.getLevel()); // prints Beginner -> wrong Tom's not a beginner
System.out.println(rita.getSex()); // prints Male -> wrong Rita's not a male

可以为每个常量Rita和Tom定义特定的行为,这些PianoClass2行为将覆盖默认行为,如下所示:

enum PianoClass3 {
    JOHN, BEN, LUKE,
    RITA {
        @Override
        public String getSex() {
            return "Female";
        }
    },
    TOM {
        @Override
        public String getLevel() {
            return "Intermediate";
        }
    };
    public String getSex() {
        return "Male";
    }
    public String getLevel() {
        return "Beginner";
    }
}

现在汤姆的水平和丽塔的性别都应该是:

PianoClass3 tom = PianoClass3.TOM;
PianoClass3 rita = PianoClass3.RITA;
System.out.println(tom.getLevel()); // 打印中级
System.out.println(rita.getSex()); // 版画女

定义内容特定主体的另一种方法是使用构造函数,例如:

enum Friend {
    MAT("Male"),
    JOHN("Male"),
    JANE("Female");
    
    private String gender;

    Friend(String gender) {
       this.gender= gender;
    }

    public String getGender() {
        return this.gender;
    }
}

和用法:

Friend mat = Friend.MAT;
Friend john = Friend.JOHN;
Friend jane = Friend.JANE;
System.out.println(mat.getGender());     // 男
System.out.println(john.getGender());    // 男
System.out.println(jane.getGender());    // 女