Java中避免過多if-else的幾種方法
太多的if-else不太直觀,難以維護(hù)。
以下面代碼為例,展示幾種替代if else的方法。
String input = "three";
@Test
public void testElse() {
if ("one".equals(input)) {
System.out.println("one");
} else if ("two".equals(input)) {
System.out.println("two");
} else if ("three".equals(input)) {
System.out.println("three");
} else if ("four".equals(input)) {
System.out.println("four");
}
}
需要引入Spring跟Guava依賴
1.Spring結(jié)合策略模式
Spring可以將一組實(shí)現(xiàn)了同樣接口的類注入一個List
/***
* 定義接口。type用來路由具體的Handler實(shí)現(xiàn)
* */
public interface Handler {
String getType();
void execute();
}
/**
* 將Handler接口的實(shí)現(xiàn)類注入一個List
* */
@Autowired
private List<Handler> handlerList;
@Test
public void testAutowireList(){
// 根據(jù)類型判斷該由哪個具體實(shí)現(xiàn)類處理
for(Handler handler:handlerList){
if(input.equals(handler.getType())){
handler.execute();
}
}
}
下面是幾種輕量級實(shí)現(xiàn).
2. 反射
通過反射動態(tài)調(diào)用相應(yīng)的方法
/***
*定義每種類型所對應(yīng)的方法
*/
public class ReflectTest {
public void methodOne() {
System.out.println("one");
}
public void methodTwo() {
System.out.println("two");
}
public void methodThree() {
System.out.println("three");
}
public void methodFour() {
System.out.println("four");
}
}
/***
*
* 通過反射,動態(tài)調(diào)用方法。采用了Guava的工具類。
* */
@Test
public void testReflect() throws Exception {
//首字母大寫,根據(jù)類型拼接方法
String methodName = "method" + LOWER_CAMEL.to(UPPER_CAMEL, input);
Method method = ReflectTest.class.getDeclaredMethod(methodName);
Invokable<ReflectTest, Object> invokable =
(Invokable<ReflectTest, Object>) Invokable.from(method);
invokable.invoke(new ReflectTest());
}
3. lambda表達(dá)式
實(shí)現(xiàn)同上面的反射,結(jié)合了Java 8的新特性:lambda表達(dá)式
@Test
public void testJava8() {
Map<String, Consumer<ReflectTest>> functionMap = Maps.newHashMap();
functionMap.put("one", ReflectTest::methodOne);
functionMap.put("two", ReflectTest::methodTwo);
functionMap.put("three", ReflectTest::methodThree);
functionMap.put("four", ReflectTest::methodThree);
functionMap.get(input).accept(new ReflectTest());
}
4. 枚舉
在枚舉里面定義一個抽象方法,每種類型對應(yīng)各自的具體實(shí)現(xiàn)。
/**
* 定義枚舉類,包含了所有類型
*/
public enum EnumTest {
ONE("one") {
@Override
public void apply() {
System.out.println("one");
}
},
TWO("two") {
@Override
public void apply() {
System.out.println("two");
}
}, THREE("three") {
@Override
public void apply() {
System.out.println("three");
}
}, FOUR("four") {
@Override
public void apply() {
System.out.println("four");
}
};
public abstract void apply();
private String type;
EnumTest(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
// 枚舉測試
@Test
public void testEnum() {
EnumTest.valueOf(input.toUpperCase()).apply();
}
到此這篇關(guān)于Java中避免過多if-else的幾種方法的文章就介紹到這了,更多相關(guān)Java 過多if-else內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式
在實(shí)際開發(fā)中,有時需要在不同平臺、不同應(yīng)用場景中對圖片格式進(jìn)行轉(zhuǎn)換,本文主要介紹了如何使用 Java 語言實(shí)現(xiàn)將 PNG 格式的圖片轉(zhuǎn)換為 BMP 格式的圖片,需要的可以了解下2025-03-03
SpringBoot學(xué)習(xí)系列之MyBatis Plus整合封裝的實(shí)例詳解
MyBatis-Plus是一款MyBatis的增強(qiáng)工具(簡稱MP),為簡化開發(fā)、提高效率,這篇文章給大家介紹MyBatis Plus整合封裝的實(shí)例詳解,感興趣的朋友跟隨小編一起看看吧2020-08-08
使用TraceId在Spring Cloud中實(shí)現(xiàn)線上問題快速定位
在微服務(wù)架構(gòu)中,服務(wù)間的互相調(diào)用使得問題定位變得復(fù)雜,在此背景下,TraceId為我們提供了一個在復(fù)雜環(huán)境中追蹤請求路徑和定位問題的工具,本文不僅介紹TraceId的基本概念,還將結(jié)合真實(shí)場景,為您展示如何在Spring Cloud中應(yīng)用它2023-09-09
javax.persistence中@Column定義字段類型方式
這篇文章主要介紹了javax.persistence中@Column定義字段類型方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Java異步判斷線程池所有任務(wù)是否執(zhí)行完成的操作方法
這篇文章主要介紹了Java異步判斷線程池所有任務(wù)是否執(zhí)行完成的方法,在這個示例中,我使用了傳統(tǒng)的匿名內(nèi)部類來創(chuàng)建Callable任務(wù)(同時也提供了Lambda表達(dá)式的注釋),以便與各種Java版本兼容,需要的朋友可以參考下2024-07-07

