Java 代碼中 if/switch 重構(gòu)方案的幾種實(shí)現(xiàn)
在 Java 開發(fā)中,想要避免出現(xiàn)大量 if...else 或 switch...case,可以使用多種設(shè)計(jì)模式和技巧來“消除條件分支”。下面總結(jié)幾種常用、實(shí)戰(zhàn)有效的方案。
1. 使用枚舉 + Lambda
適合一些輕量級(jí)邏輯分派。
package com.example.demo.enums;
import lombok.AllArgsConstructor;
import java.util.function.BiFunction;
@AllArgsConstructor
public enum OperationEnum {
ADD((a, b) -> a + b),
SUB((a, b) -> a - b),
MUL((a, b) -> a * b),
DIV((a, b) -> a / b);
private final BiFunction<Integer, Integer, Integer> function;
public int apply(int a, int b) {
return function.apply(a, b);
}
}
使用代碼,方法參數(shù)傳遞過來一個(gè)枚舉,直接調(diào)用 apply 方法就行:
public static void main(String[] args) {
int result = operation(OperationEnum.MUL, 2, 3);
System.out.println(result);
}
//這個(gè)方法減少了ifelse判斷
private static int operation(OperationEnum operationEnum, int a, int b) {
return operationEnum.apply(a, b);
}
2. 使用枚舉 + Lambda + Map
適合簡(jiǎn)單分派邏輯。
package com.example.demo.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ActionEnum {
ACTION_A("A"),
ACTION_B("B");
private final String action;
}
package com.example.demo.handler;
import com.example.demo.enums.ActionEnum;
import java.util.HashMap;
import java.util.Map;
public class ActionHandler {
private static final Map<String, Runnable> ACTION = new HashMap<>();
static {
ACTION.put(ActionEnum.ACTION_A.getAction(), () -> System.out.println("執(zhí)行邏輯 A"));
ACTION.put(ActionEnum.ACTION_B.getAction(), () -> System.out.println("執(zhí)行邏輯 B"));
}
public static void execute(ActionEnum actionEnum) {
ACTION.getOrDefault(actionEnum.getAction(), () -> System.out.println("默認(rèn)邏輯")).run();
}
}
使用代碼:
ActionHandler.execute(ActionEnum.ACTION_A);
3. 使用責(zé)任鏈模式
適合逐步判斷、條件過濾的業(yè)務(wù),比如審批、數(shù)據(jù)校驗(yàn)??勺杂蓴U(kuò)展處理鏈,避免多層 if 嵌套。
首先提供一個(gè)抽象類,Request是個(gè)輔助類,可根據(jù)真實(shí)業(yè)務(wù)修改:
package com.example.demo.handler;
import lombok.Data;
@Data
public class Request {
private boolean authenticated;
private boolean validate;
}
package com.example.demo.handler;
import lombok.Setter;
public abstract class Handler {
@Setter
protected Handler next;
public abstract void handle(Request request);
}
三個(gè)繼承抽象類的子類:
package com.example.demo.handler;
public class AuthHandler extends Handler {
@Override
public void handle(Request request) {
if (request.isAuthenticated()) {
System.out.println("login success");
if (next != null) {
next.handle(request);
}
} else {
System.out.println("login fail");
}
}
}
package com.example.demo.handler;
public class ValidationHandler extends Handler{
@Override
public void handle(Request request) {
if (request.isValidate()){
System.out.println("validation success");
if (next != null) {
next.handle(request);
}
}else {
System.out.println("validation failed");
}
}
}
package com.example.demo.handler;
public class BusinessHandler extends Handler {
@Override
public void handle(Request request) {
System.out.println("start handler business");
}
}
使用代碼:
Request request = new Request(); request.setAuthenticated(true); request.setValidate(true); AuthHandler authHandler = new AuthHandler(); ValidationHandler validationHandler = new ValidationHandler(); BusinessHandler businessHandler = new BusinessHandler(); //設(shè)置處理順序 authHandler.setNext(validationHandler); validationHandler.setNext(businessHandler); //開始觸發(fā)執(zhí)行 authHandler.handle(request);
執(zhí)行結(jié)果:
login success validation success start handler business
4. 使用策略模式
參考我的另一篇博文:SpringBoot 優(yōu)雅實(shí)現(xiàn)接口的多實(shí)現(xiàn)類方式
到此這篇關(guān)于Java 代碼中 if/switch 重構(gòu)方案的幾種實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java if/switch 重構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring Mvc配置xml使ResponseBody返回Json的方法示例
這篇文章主要給大家介紹了關(guān)于spring Mvc配置xml使ResponseBody返回Json的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
@PathVariable和@RequestParam傳參為空問題及解決
這篇文章主要介紹了@PathVariable和@RequestParam傳參為空問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java多線程知識(shí)點(diǎn)全面總結(jié)
這篇文章主要介紹了Java多線程知識(shí)點(diǎn)全面總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
IDEA實(shí)現(xiàn)純java項(xiàng)目并打包jar的步驟(不使用Maven,Spring)
在Java開發(fā)中我們通常會(huì)將我們的項(xiàng)目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運(yùn)行,這篇文章主要介紹了IDEA實(shí)現(xiàn)純java項(xiàng)目并打包jar(不使用Maven,Spring)的相關(guān)資料,需要的朋友可以參考下2025-08-08
Java8 新特性之日期時(shí)間對(duì)象及一些其他特性
這篇文章主要介紹了Java8 新特性之日期時(shí)間對(duì)象及一些其他特性,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Java之Spring注解配置bean實(shí)例代碼解析
這篇文章主要介紹了Java之Spring注解配置bean實(shí)例代碼解析,具有一定參考價(jià)值,文中還有有關(guān)Spring學(xué)習(xí)的資料下載鏈接及相關(guān)內(nèi)容推薦,需要的朋友可以了解下。2017-09-09
SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)
Java?提供了內(nèi)置的?assert?機(jī)制,而?Spring?框架也提供了更強(qiáng)大的?Assert?工具類來幫助開發(fā)者進(jìn)行參數(shù)校驗(yàn)和狀態(tài)檢查,下面我們就來看看SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)吧2025-07-07

