当前位置: 首页 > news >正文

用《设计模式》的角度优化 “枚举”

枚举应该都有用过,枚举主要的作用是为了方便用户查找和引用枚举。

案例一

下面的枚举逻辑很简单,就是通过枚举值返回不同的结果。

public enum OperationEnum {
    EQUAL_TO,
    CONTAINS,
    START_WITH,
    END_WITH;

    public String getOperationValue(String value) {
        if (this == EQUAL_TO) {
            return "'" + value + "'";
        } else if (this == START_WITH) {
            return "/" + value + ".*/";
        } else if (this == END_WITH) {
            return "/" + value + ".*/";
        } else {
            return "/.*" + value + ".*/";
        }
    }
}

学了《设计模式》之后,我们很容易看出这段代码的问题。
代码中getOperationValue里使用if...else...的结构,导致枚举值之间存在耦合关系。
举个例子来说,当我们要增加新的枚举值时需要修改这段if...else...代码。
那么明显它没有符合低耦合 高内聚的设计理念。

我们也都知道,抽象比具体 更稳定
那为了避免使用if...else...结构,我们将getOperationValue定义为抽象方法,如下

通过重载抽象方法进行解耦

enum OperationEnum {
    EQUAL_TO {
        @Override
        public String getOperationValue(String value) {
            return "'" + value + "'";
        }
    },
    CONTAINS {
        @Override
        public String getOperationValue(String value) {
            return "/.*" + value + ".*/";
        }
    },
    START_WITH {
        @Override
        public String getOperationValue(String value) {
            return "/" + value + ".*/";
        }
    },
    END_WITH {
        @Override
        public String getOperationValue(String value) {
            return "/.*" + value + "/";
        }
    };

	/**
	 * 定义抽象方法
	 */
    public abstract String getOperationValue(String value);
}

我们对比前后的代码,很明显,新增枚举时,带抽象方法重载的方式影响更小。

是否觉得上述代码已经足够好了?

利用接口的方式实现枚举

import java.util.function.Function;

public enum OperationEnum {
    EQUAL_TO((value) -> "'" + value + "'"),
    CONTAINS((value) -> "/.*" + value + ".*/"),
    START_WITH((value) -> "/" + value + ".*/"),
    END_WITH((value) -> "/.*" + value + "/");
    
    private final Function<String, String> function;

    OperationEnum(Function<String, String> function) {
        this.function = function;
    }

    public String getOperationValue(String value) {
        return function.apply(value);
    }
}

如果逻辑足够简单,从代码来说这种代码更简洁明了。
如果逻辑比较复杂,可以将lambda表达式用接口实现类代替,然后构造的时候传入对应的接口实现

相关文章:

  • Python零基础学习第三天:函数与数据结构
  • PyTorch深度学习在硬件与资源限制下分布式训练和多GPU加速等技术的实例代码
  • 从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践
  • Linux 指定命令行前后添加echo打印内容
  • Unity URP渲染管线烘焙场景教程
  • docker装Oracle
  • Spring MVC源码分析のinit流程
  • Rust语言:开启高效编程之旅
  • 线程安全---java
  • 阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!
  • 比特币中的相关技术
  • Oracle数据恢复:闪回查询
  • 工程化与框架系列(26)--前端可视化开发
  • 【芯片验证】verificationguide上的36道UVM面试题
  • 模型压缩技术(二),模型量化让模型“轻装上阵”
  • USB2.0 学习(1)字段和包
  • 游戏官方网站:pc页面与移动端布局做到响应式的因素
  • 点云从入门到精通技术详解100篇-基于深度学习的三维点云分类分割
  • Spring Boot 调用DeepSeek API的详细教程
  • Python Flask 使用不同的 HTTP 方法类型处理请求
  • 联合国报告:全球经济前景恶化,面临高度不确定性
  • 一个多月来上海交大接连“牵手”三区,在这些方面进行区校合作
  • 习近平会见智利总统博里奇
  • 中国女足将于5月17日至6月2日赴美国集训并参加邀请赛
  • 夜读丨取稿费的乐趣
  • 金科股份重整方案通过,正式进入重整计划执行环节