之前写java枚举时,都是中规中矩的写,从来没见过在枚举中写抽象方法的,但最近换了新公司,接手了新项目,发现枚举中竟然写了抽象方法,由于之前没接触过这种写法,所以这里记录下
实体类student代码
@Data
@AllArgsConstructor
@NoArgsConstructor
//这里就直接用lombok的注解去实现get、set、构造函数了
public class Student {
String name;
Integer age;
String idcardNumber;
Boolean sex;
String height;
}
枚举类
/**
* 定义一个Student枚举,当Student中的字段不为空时,返回各个字段的value
*/
public enum StudentEnum {
NAME("学生姓名") {
@Override
public String resStudentFieldValue(Student student) {
if (StringUtils.isNotEmpty(student.getName())){
return student.getName();
}
return null;
}
},
AGE("学生年龄") {
@Override
public String resStudentFieldValue(Student student) {
if (student.getAge() != null){
return student.getAge().toString();
}
return null;
}
},
IDCARDNUMBER("学生身份证号") {
@Override
public String resStudentFieldValue(Student student) {
if (StringUtils.isNotEmpty(student.getIdcardNumber())){
return student.getIdcardNumber();
}
return null;
}
},
SEX("学生性别") {
@Override
public String resStudentFieldValue(Student student) {
if (student.getSex() != null){
return student.getSex()? "男":"女";
}
return null;
}
},
HEIGHT("学生身高") {
@Override
public String resStudentFieldValue(Student student) {
if (StringUtils.isNotEmpty(student.getHeight())){
return student.getHeight();
}
return null;
}
}
;
private String desc;
StudentEnum(String desc) {
this.desc = desc;
}
//返回student对象中的属性值
public abstract String resStudentFieldValue(Student student);
}
测试main函数
public class TestMain {
public static void main(String[] args) {
Student student = new Student("张三", 22, "110101199604280816", true, "176cm");
//student.setAge(null);
List<String> collect = Arrays.stream(StudentEnum.values()).map(e -> e.resStudentFieldValue(student))
.filter(StringUtils::isNotEmpty)
.collect(Collectors.toList());
System.out.println("学生的详细信息为:"+collect.toString());
/**
* 如果注释了student.setAge(null),
* 打印的结果:学生的详细信息为:[张三, 22, 110101199604280816, 男, 176cm]
*/
/**
* 如果没注释student.setAge(null),
* 打印的结果:学生的详细信息为:[张三, 110101199604280816, 男, 176cm]
*/
}
}
从上面的demo中可以看出,student枚举中有多个类型(NAME、AGE、IDCARDNUMBER。。。),然后又定义了一个抽象方法,具体作用是要返回student实体的每个相对应的属性value,所以在NAME、AGE。。。中要实现这个抽象方法并写具体的业务逻辑,具体使用时就是传入一个student对象,然后枚举中每个value中重写的抽象方法都走一遍
其实个人感觉,枚举中写抽象类,更多的用法就是为了根据传入的参数走一遍所有的枚举值,然后走不同枚举值中的具体业务逻辑最终返回不同的返回值(返回值类型一样)
,由于我这是第一次接触这种写法,所以可能每个人的理解有所不同,如果说错了还请指出