用《設計模式》的角度優化 “枚舉”

枚舉應該都有用過,枚舉主要的作用是為了方便用戶查找和引用枚舉。

案例一

下面的枚舉邏輯很簡單,就是通過枚舉值返回不同的結果。

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 {@Overridepublic String getOperationValue(String value) {return "'" + value + "'";}},CONTAINS {@Overridepublic String getOperationValue(String value) {return "/.*" + value + ".*/";}},START_WITH {@Overridepublic String getOperationValue(String value) {return "/" + value + ".*/";}},END_WITH {@Overridepublic 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.pswp.cn/diannao/72904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72904.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL根據分隔符折分不同的內容放到臨時表

SQL Server存儲過程里根據分隔符折分不同的內容放到臨時表里做查詢條件&#xff0c;以下分隔符使用“/”&#xff0c;可修改不同分隔符 --根據分隔符折分不同的內容放到臨時表--------------- SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id, LTRIM(RTR…

Ubuntu切換lowlatency內核

文章目錄 一. 前言二. 開發環境三. 具體操作 一. 前言 低延遲內核&#xff08;Lowlatency Kernel&#xff09; 旨在為需要低延遲響應的應用程序設計的內核版本。Linux-lowlatency特別適合音頻處理、實時計算、游戲和其他需要及時響應的實時任務。其主要特點是優化了中斷處理、調…

基于Django創建一個WEB后端框架(DjangoRestFramework+MySQL)流程

一、Django項目初始化 1.創建Django項目 Django-admin startproject 項目名 2.安裝 djangorestframework pip install djangorestframework 解釋: Django REST Framework (DRF) 是基于 Django 框架的一個強大的 Web API 框架&#xff0c;提供了多種工具和庫來構建 RESTf…

VUE3開發-9、axios前后端跨域問題解決方案

VUE前端解決跨域問題 前端頁面需要改寫 如果無效&#xff0c;記得重啟服務器 后端c#解決跨域問題 前端js取值&#xff0c;后端c#跨域_c# js跨域-CSDN博客

DailyNotes 增加提醒功能

TODO&#xff1a;準備給 DailyNotes 增加一個提醒功能&#xff0c;準備接入 AI 來做一些事情。試了一下&#xff0c;非常靠譜。 具體 DailyNotes 和 Ollama 的交互方式&#xff0c;可以直接調用命令行&#xff0c;也可以走網絡API。 rayuK2CD9WCYN4 ~ % ollama run deepseek-…

PY32MD320單片機 QFN32封裝,內置多功能三相 NN 型預驅。

PY32MD320單片機是普冉半導體的一款電機專用MCU&#xff0c;芯片采用了高性能的 32 位 ARM Cortex-M0 內核&#xff0c;主要用于電機控制。PY32MD320嵌入高達 64 KB Flash 和 8 KB SRAM 存儲器&#xff0c;最高工作頻率 48 MHz。PY32MD320單片機的工作溫度范圍為 -40 ~ 105 ℃&…

OpenManus介紹及本地部署體驗

1.OpenManus介紹 OpenManus&#xff0c;由 MetaGPT 團隊精心打造的開源項目&#xff0c;于2025年3月發布。它致力于模仿并改進 Manus 這一封閉式商業 AI Agent 的核心功能&#xff0c;為用戶提供無需邀請碼、可本地化部署的智能體解決方案。換句話說&#xff0c;OpenManus 就像…

【貪心算法】簡介

1.貪心算法 貪心策略&#xff1a;解決問題的策略&#xff0c;局部最優----》全局最優 &#xff08;1&#xff09;把解決問題的過程分成若干步 &#xff08;2&#xff09;解決每一步的時候&#xff0c;都選擇當前看起來的“最優”的算法 &#xff08;3&#xff09;“希望”得…

springboot知識點以及源碼解析(2)

web開發--靜態規則與定制化 springboot對靜態資源的映射規則&#xff1a;在類路徑下面定義目錄static或public或resources或者META-INF/resources&#xff0c;訪問時項目根目錄靜態資源的名稱 在springboot中&#xff0c;如果項目中存在同名的靜態資源和同名的動態資源。那么我…

C++:string容器(下篇)

1.string淺拷貝的問題 // 為了和標準庫區分&#xff0c;此處使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 錯誤示范//String(const char* str nullptr) // 錯誤示范String(const char* str …

使用 vxe-table 導出 excel,支持帶數值、貨幣、圖片等帶格式導出

使用 vxe-table 導出 excel&#xff0c;支持帶數值、貨幣、圖片等帶格式導出&#xff0c;通過官方自動的導出插件 plugin-export-xlsx 實現導出功能 查看官網&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;htt…

JavaScript數據類型和內存空間

一、JavaScript 數據類型 基本數據類型&#xff1a;字符串&#xff08;String&#xff09;、數字(Number)、布爾(Boolean)、空&#xff08;Null&#xff09;、未定義&#xff08;Undefined&#xff09;、Symbol 引用數據類型&#xff1a;對象(Object)、數組(Array)、函數(Fun…

DNS Beaconing

“DNS Beaconing” 是一種隱蔽的網絡通信技術&#xff0c;通常與惡意軟件&#xff08;如木馬、僵尸網絡&#xff09;相關。攻擊者通過定期發送 DNS請求 到受控的域名服務器&#xff08;C&C服務器&#xff09;&#xff0c;實現與惡意軟件的隱蔽通信、數據傳輸或指令下發。由…

python中采用opencv作常規的圖片處理的方法~~~

在python中&#xff0c;我們經常會需要對圖片做灰度/二值化/模糊等處理&#xff0c;這時候opencv就是我們的好幫手了&#xff0c;下面我來介紹一下相關用法: 首先&#xff0c;需要安裝opencv-python庫: 然后&#xff0c;在你的代碼中引用: import cv2 最后就是代碼了&#x…

CmBacktrace的學習跟移植思路

學習移植CmBacktrace需要從理解其核心功能、適用場景及移植步驟入手&#xff0c;結合理論學習和實踐操作。以下是具體的學習思路與移植思路&#xff1a; 一、學習思路 理解CmBacktrace的核心功能 CmBacktrace是針對ARM Cortex-M系列MCU的錯誤追蹤庫&#xff0c;支持自動診斷Har…

支付寶當面付java,php,sdk下載

SDK & Demo 獲取 - 支付寶文檔中心 開放平臺服務端 SDK 為了幫助開發者調用開放接口&#xff0c;支付寶提供了開放平臺服務端 SDK&#xff0c;包含 Java、PHP、NodeJS、Python 和 .NET 等語言版本&#xff0c;DEMO 中封裝了簽名 & 驗簽、HTTP 接口請求等基礎功能。 詳…

Cocos Creator Shader入門實戰(三):CCEffect參數配置講解

引擎版本&#xff1a;3.8.5 您好&#xff0c;我是鶴九日&#xff01; 回顧 稍微回顧下前面兩篇博客講解的內容&#xff1a; 一、Cocos渲染效果的實現需要Material材質和Effect資源的互相配合。 二、Effect資源負責Shader片段的編寫和屬性配置&#xff0c;Material材質負責對E…

AI日報 - 2025年3月10日

AI日報 - 2025年3月10日 &#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO預測強AI最早2026年到來 &#x1f52c; SAGE框架提升問答質量61.25%&#xff0c;Reflexion框架將GPT-4成功率提至91% ▎&#x1f4bc; 商業動向 | xA…

【SegRNN 源碼理解】【今天不水文系列】編碼器部分理解

我來小小的理解一下&#xff1a; 首先&#xff0c;16 batchsize&#xff0c;60sequendcelength&#xff0c;7 個特征的通俗解釋 16 個獨立的樣本&#xff0c;每個樣本有 60 個連續的時間步及對應的標簽值&#xff0c;每個時間步有 60 個特征 所以就是因為樣本是隨機從訓練集…

加速科技Flex10K-L測試機:以硬核創新重塑顯示驅動芯片測試新標桿!

在2024年召開的世界顯示產業創新發展大會上&#xff0c;加速科技自主研發的高密度顯示驅動芯片測試設備Flex10K-L憑借其突破性技術創新&#xff0c;成功入選"十大創新技術&#xff08;產品&#xff09;"。作為國內顯示驅動芯片測試領域的標桿性設備&#xff0c;Flex1…