java枚举中写抽象方法

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

实体类student代码

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
//这里就直接用lombok的注解去实现get、set、构造函数了
public class Student {
    String name;
    Integer age;
    String idcardNumber;
    Boolean sex;
    String height;

}

枚举类

java 复制代码
/**
 * 定义一个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函数

java 复制代码
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中重写的抽象方法都走一遍

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

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w5 小时前
什么是AOP
java
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck6 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha6 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞6 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu7 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
蜗牛互联网7 小时前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端