• java枚举中写抽象方法


    之前写java枚举时,都是中规中矩的写,从来没见过在枚举中写抽象方法的,但最近换了新公司,接手了新项目,发现枚举中竟然写了抽象方法,由于之前没接触过这种写法,所以这里记录下

    实体类student代码

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    //这里就直接用lombok的注解去实现get、set、构造函数了
    public class Student {
        String name;
        Integer age;
        String idcardNumber;
        Boolean sex;
        String height;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    枚举类

    /**
     * 定义一个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);
    }
    
    • 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
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    测试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]
    		*/
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    从上面的demo中可以看出,student枚举中有多个类型(NAME、AGE、IDCARDNUMBER。。。),然后又定义了一个抽象方法,具体作用是要返回student实体的每个相对应的属性value,所以在NAME、AGE。。。中要实现这个抽象方法并写具体的业务逻辑,具体使用时就是传入一个student对象,然后枚举中每个value中重写的抽象方法都走一遍

    其实个人感觉,枚举中写抽象类,更多的用法就是为了根据传入的参数走一遍所有的枚举值,然后走不同枚举值中的具体业务逻辑最终返回不同的返回值(返回值类型一样),由于我这是第一次接触这种写法,所以可能每个人的理解有所不同,如果说错了还请指出

  • 相关阅读:
    Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional
    final关键字
    pytorch学习神经网络的搭建
    kali 脚本应用(二)
    测试工程师应具备的软实力
    C++指针和引用
    如何安装Docker桌面版到Windows系统上
    2023年个人怎么报考湖北建筑安全员C2C3证-叙后尘
    【RTOS训练营】GPIO知识和预习安排 + 晚课提问
    基于javaweb的农业信息管理系统(java+ssm+jsp+js+html+mysql)
  • 原文地址:https://blog.csdn.net/L_Mr_ll/article/details/133785798