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

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

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

案例一

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

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表达式用接口实现类代替,然后构造的时候传入对应的接口实现


http://www.kler.cn/a/579082.html

相关文章:

  • Redis客户端
  • OSPF的各种LSA类型,多区域及特殊区域
  • VUE叉的工作原理?
  • 使用 Python 开发的简单招聘信息采集系统
  • 文献分享: ConstBERT固定数目向量编码文档
  • dfs:五子棋对弈15蓝桥杯a组1题
  • ESP32的IDF开发学习-WiFi的开启、配置与连接
  • Android OKHttp缓存模块原理分析
  • JVM类加载器面试题及原理
  • 云原生(六十) | Web源码迁移部署
  • C++ 滑动窗口
  • 玩转ChatGPT:GPT 深入研究功能
  • 当代体育科技杂志社《当代体育科技》编辑部2025年第2期目录
  • 完整例子和调用关系qt OpenGL
  • Electron-Forge + Vue3 项目初始化
  • Qt常用控件之表格QTableWidget
  • 【leetcode100】组合总和Ⅱ
  • 【MySQL】事务|概念|如何回滚|基本特性|MySQL事务隔离性具体怎么实现的
  • 如何不重启,生效windows环境变量
  • 高效Android MQTT封装工具:简化物联网开发,提升性能与稳定性