目錄
問題出現(xiàn):
如何 Java 中的大量的 if else 判斷?
解決方案:
? ?1.策略模式
????2.工廠模式
? ? 3.映射表
? ?4.反射+配置文件------極力推薦使用?。。。?!
問題出現(xiàn):
如何 Java 中的大量的 if else 判斷?
在編寫Java相關(guān)程序時(shí),我們經(jīng)常遇到:
?大量的 if? else 語句,無不讓人內(nèi)心瘋狂,這都是些啥代碼?。。。。。?!一點(diǎn)編程藝術(shù)的沒有,簡(jiǎn)稱:爛代碼!
如果學(xué)習(xí)過設(shè)計(jì)模式,那應(yīng)該沒問題了。
解決方案:
在 Java 中,有多種方式可以避免大量的 if-else 判斷。下面列舉一些常用的方法和相關(guān)案例:
?
? ?1.策略模式
? ? ? ? 策略模式是一種行為型設(shè)計(jì)模式,它通過定義一系列算法類(策略類),將算法的實(shí)現(xiàn)與使用分離開來,使得算法可以獨(dú)立于使用它的客戶端而變化。在 Java 中,策略模式通常被應(yīng)用于業(yè)務(wù)邏輯中,用于處理不同的業(yè)務(wù)場(chǎng)景和業(yè)務(wù)規(guī)則。具體實(shí)現(xiàn)如下:
? ? ? ? 首先,定義一個(gè)策略接口或抽象類,用于封裝具體的算法:
public interface Strategy {
void execute();
}
? ? ? ?然后,定義多個(gè)具體的策略類,實(shí)現(xiàn)該接口或抽象類:
public class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
// 實(shí)現(xiàn)具體的算法 A
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
// 實(shí)現(xiàn)具體的算法 B
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public void execute() {
// 實(shí)現(xiàn)具體的算法 C
}
}
? ? ? ? 接著,定義一個(gè)上下文類,用于管理所有的策略:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
?????????最后,在客戶端中,根據(jù)業(yè)務(wù)需要,傳入相應(yīng)的策略對(duì)象,執(zhí)行對(duì)應(yīng)的算法:
Strategy strategy = new ConcreteStrategyA(); // or new ConcreteStrategyB() 或者new ConcreteStrategyC()
Context context = new Context(strategy);
context.executeStrategy();
?
????2.工廠模式
? ? ? ?工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它通過定義一個(gè)工廠類來封裝對(duì)象的創(chuàng)建過程,從而將客戶端代碼與具體的產(chǎn)品實(shí)現(xiàn)解耦。在 Java 中,工廠模式通常被應(yīng)用于對(duì)象的創(chuàng)建和組裝場(chǎng)景中。具體實(shí)現(xiàn)如下:
??????首先,定義一個(gè)產(chǎn)品接口或抽象類,用于封裝產(chǎn)品的通用接口或抽象父類:
public interface Product {
void method();
}
????????然后,定義多個(gè)具體的產(chǎn)品類,實(shí)現(xiàn)該接口或抽象父類:
public class ConcreteProductA implements Product {
@Override
public void method() {
// 實(shí)現(xiàn)具體的產(chǎn)品 A 的方法
}
}
public class ConcreteProductB implements Product {
@Override
public void method() {
// 實(shí)現(xiàn)具體的產(chǎn)品 B 的方法
}
}
public class ConcreteProductC implements Product {
@Override
public void method() {
// 實(shí)現(xiàn)具體的產(chǎn)品 C 的方法
}
}
????????接著,定義一個(gè)工廠類,用于創(chuàng)建產(chǎn)品對(duì)象:
public class Factory {
public static Product create(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
case "C":
return new ConcreteProductC();
default:
throw new IllegalArgumentException("Invalid type: " + type);
}
}
}
????????最后,在客戶端中,調(diào)用工廠類的靜態(tài)方法,創(chuàng)建對(duì)應(yīng)的產(chǎn)品對(duì)象:
Product product = Factory.create("A"); // or Factory.create("B") 或者Factory.create("C")
product.method();
?
? ? 3.映射表
????????映射表是一種基于哈希表實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),它可以將多個(gè)條件值(如字符串或枚舉值)映射到對(duì)應(yīng)的處理函數(shù)上。在 Java 中,通過使用 Map 數(shù)據(jù)結(jié)構(gòu),可以很方便地實(shí)現(xiàn)映射表。具體實(shí)現(xiàn)如下:
????????首先,創(chuàng)建一個(gè) Map 對(duì)象,用于存儲(chǔ)條件值和處理函數(shù)之間的映射關(guān)系:
Map<String, Runnable> map = new HashMap<>();
????????然后,將每個(gè)條件值和對(duì)應(yīng)的處理函數(shù)注冊(cè)到 Map 中:
map.put("value1", () -> {
// 處理 value1 條件的邏輯
});
map.put("value2", () -> {
// 處理 value2 條件的邏輯
});
// ...
????????最后,在客戶端中,根據(jù)需要執(zhí)行對(duì)應(yīng)的處理函數(shù):
String condition = "value1"; // or "value2" 或者其他條件值
Runnable handler = map.get(condition);
if (handler != null) {
handler.run();
} else {
throw new IllegalArgumentException("Unsupported condition: " + condition);
}
? ?4.反射+配置文件------極力推薦使用?。。。?!
可以看看這個(gè):http://t.csdn.cn/XJIpu?
不知道反射?看這:-----》》》http://t.csdn.cn/5sbcp
- 在 Java 中,if-else 語句通常用來處理不同的條件分支。雖然 if-else 語句很好用,但如果有大量的 if-else 分支,會(huì)降低程序的可讀性、可維護(hù)性和可擴(kuò)展性。當(dāng)需要添加或刪除某個(gè)條件分支時(shí),需要修改相應(yīng)的代碼,這樣容易引入新的錯(cuò)誤或?qū)е虏槐匾鸟詈稀榱吮苊膺@些問題,可以使用反射和配置文件來解決大量的 if-else 判斷。
- 反射是一種在運(yùn)行時(shí)獲取類信息和類實(shí)例,并通過這些信息和實(shí)例來調(diào)用類的方法或操作其屬性的機(jī)制。Java 提供了一組反射 API,可以在運(yùn)行時(shí)獲取類的結(jié)構(gòu)信息、創(chuàng)建類的實(shí)例、訪問類的屬性、調(diào)用類的方法等。使用反射機(jī)制可以將程序的控制流程動(dòng)態(tài)化,不再依賴于編譯時(shí)確定的類型和方法,從而提高了程序的靈活性和可擴(kuò)展性。
- 配置文件是一種文本文件,用于保存程序的配置信息。Java 中的配置文件通常以 .properties 或 .xml 格式保存,其中 .properties 文件格式最簡(jiǎn)單,它由多個(gè)屬性名和屬性值組成,每個(gè)屬性名和屬性值之間使用等號(hào)(=)連接。使用配置文件可以將程序的配置信息從代碼中分離出來,使得程序的配置更加靈活和易于管理。
使用反射和配置文件來避免大量的 if-else 判斷的實(shí)現(xiàn)步驟如下:
?
--1.定義一個(gè)接口或抽象類,用于定義通用行為或方法。例如,定義一個(gè)接口 Action,用于執(zhí)行某個(gè)動(dòng)作:
public interface Action {
void execute(String param1, String param2);
}
--2.定義多個(gè)實(shí)現(xiàn)該接口或抽象類的具體類,實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。例如,定義兩個(gè)實(shí)現(xiàn)類 ConcreteAction1 和 ConcreteAction2。
public class ConcreteAction1 implements Action {
@Override
public void execute(String param1, String param2) {
// 處理 ConcreteAction1 業(yè)務(wù)邏輯
}
}
public class ConcreteAction2 implements Action {
@Override
public void execute(String param1, String param2) {
// 處理 ConcreteAction2 業(yè)務(wù)邏輯
}
}
--3.將每個(gè)具體類的信息(包括類名、參數(shù)等)保存到配置文件中。例如,將上述兩個(gè)類的信息保存到 config.properties 文件中。
action.1=com.example.ConcreteAction1
action.2=com.example.ConcreteAction2
--4.在程序啟動(dòng)時(shí),讀取配置文件,并通過反射機(jī)制創(chuàng)建具體類的實(shí)例。例如,讀取 config.properties 文件中的屬性,并創(chuàng)建 ConcreteAction1 的實(shí)例。
Properties props = new Properties();
try (InputStream stream = getClass().getResourceAsStream("config.properties")) {
props.load(stream);
}
String actionName = props.getProperty("action.1"); // 具體類的類名
Class<?> actionClass = Class.forName(actionName);
Action action = (Action) actionClass.getDeclaredConstructor().newInstance(); // 創(chuàng)建具體類的實(shí)例
--5.在程序運(yùn)行時(shí),通過 Action 接口調(diào)用具體類的方法。例如,執(zhí)行 ConcreteAction1 的 execute 方法,并傳入?yún)?shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-497093.html
action.execute("param1", "param2");
????????使用反射和配置文件來避免大量的 if-else 判斷可以將程序的控制流程動(dòng)態(tài)化,從而提高了程序的靈活性和可擴(kuò)展性。當(dāng)需要添加或刪除某個(gè)條件分支時(shí),只需要修改配置文件,而不需要修改代碼。使用這種方式還可以將程序的配置信息和業(yè)務(wù)邏輯分離開來,使得程序更加易于管理和維護(hù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-497093.html
到了這里,關(guān)于如何 Java 中的大量的 if else 判斷?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!