java枚举中写抽象方法

之前写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中重写的抽象方法都走一遍

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java枚举类是一种特殊的类,它的实例是有限的、固定的,每一个实例都是常量。我们可以使用枚举类来表示一组相关的常量集合,例如表示星期、月份、性别等。在这个问题,我们可以使用枚举类来表示不同的条件。 下面是一个示例代码,演示如何使用枚举类来表示不同的条件: ```java public enum Condition { CONTAINS_A { @Override public boolean matches(String s) { return s.contains("a"); } }, LENGTH_GT_5 { @Override public boolean matches(String s) { return s.length() > 5; } }; public abstract boolean matches(String s); } ``` 在这个例子,我们定义了一个枚举类 `Condition`,其包含两个枚举值 `CONTAINS_A` 和 `LENGTH_GT_5`,分别表示包含字母 "a" 和长度大于 5 这两种条件。每个枚举值都实现了一个抽象方法 `matches`,用于判断给定的字符串是否符合该条件。 下面是一个使用示例: ```java public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("aaa", "bbb", "cccc"); // 根据不同的条件筛选 List<String> result1 = filter(list, Condition.CONTAINS_A); List<String> result2 = filter(list, Condition.LENGTH_GT_5); // 输出结果 System.out.println(result1); // [aaa] System.out.println(result2); // [cccc] } public static List<String> filter(List<String> list, Condition condition) { List<String> result = new ArrayList<>(); for (String s : list) { if (condition.matches(s)) { result.add(s); } } return result; } } ``` 在这个例子,我们定义了一个 `filter` 方法,接收一个列表和一个 `Condition` 枚举值作为参数,用于根据不同的条件对列表进行筛选。在 `filter` 方法内部,我们遍历列表的每个元素,调用给定条件的 `matches` 方法进行判断,符合条件的元素会被添加到结果列表。在 `main` 方法,我们分别使用 `CONTAINS_A` 和 `LENGTH_GT_5` 两个枚举值来调用 `filter` 方法,并输出结果。 这样,我们就成功地使用枚举类来表示不同的条件,并将其作为方法的参数进行传递。这种做法的好处是可以让代码更加简洁、易读,避免了使用魔法值或者其他不太直观的方式来表示条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值