作為一名在第一線搬磚的打工人,if...else幾乎是最常見的代碼了。下面我們一起來看一下如何干掉if...else吧,看看你掌握幾種。
1. 提前 return
這種方法一般只適合分支結(jié)構(gòu)很簡單的if...else,我們可以提前 return,比如一些參數(shù)校驗(yàn)。
private void processStrings(List<String> list) {
if (null != list) {
doSomething();
}
}
private void processStrings(List<String> list) {
if (null == list) {
return;
}
doSomething();
}
2. Optional 判空
private String getOrderStatus(int id) {
Order order = getById(id);
if (order == null) {
return "-1";
} else {
return order.getStatus();
}
}
對(duì)于這種代碼可以利用 Optional 可以非常優(yōu)雅地解決。
❝Optional類是 Java 8 中引入的一個(gè)用于處理可能為 null 的值的容器類。
return Optional.ofNullable(order).map(o -> o.getOrderStatus()).orElse("-1");
3. 枚舉
private String getOrderStatusDes(String status) {
if ("1".equals(status)) {
status = "未支付";
} else if ("2".equals(status)) {
status = "已支付";
} else if ("3".equals(status)) {
status = "已發(fā)貨";
} else if ("4".equals(status)) {
status = "已簽收";
} else if ("5".equals(status)) {
status = "已評(píng)價(jià)";
}
return status;
}
這種類型的代碼非常適合枚舉來解決。先定義一個(gè)枚舉類:
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
UN_PAID("1","未支付"),
PAID("2","已支付"),
SEND("3","已發(fā)貨"),
SING("4","已簽收"),
EVALUATE("5","已評(píng)價(jià)");
private String status;
private String statusDes;
public static OrderStatusEnum getDes(String status) {
return Arrays.stream(values()).filter(o -> o.getStatus().equals(status)).findFirst().orElse(null);
}
}
有了這個(gè)枚舉,上面代碼直接可以優(yōu)化為一行代碼:
String orderStatusDes = Optional.ofNullable(OrderStatusEnum.getDes("3")).map(e -> e.getStatusDes()).orElse("");
4. 策略模式 + 工廠方法
假設(shè)有如下代碼:
if ("codeA".equals(code)) {
doSomethingA();
} else if ("codeB".equals(code)) {
doSomethingB();
} else if ("codeC".equals(code)) {
doSomethingC();
}
可以使用使用策略模式 + 工廠方法來優(yōu)化,首先創(chuàng)建一個(gè)處理的策略接口:
public interface HandleService {
void doSomething();
}
具體的策略實(shí)現(xiàn)類:
public class HandleServiceImplA implements HandleService {
@Override
public void doSomething() {
System.out.println("執(zhí)行A計(jì)劃...");
}
}
public class HandleServiceImplB implements HandleService {
@Override
public void doSomething() {
System.out.println("執(zhí)行B計(jì)劃...");
}
}
public class HandleServiceImplC implements HandleService {
@Override
public void doSomething() {
System.out.println("執(zhí)行C計(jì)劃...");
}
}
工廠類,統(tǒng)一調(diào)度,用來管理這些策略,如下:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class HandleServiceFactory {
private HandleServiceFactory(){
}
/** 使用ConcurrentHashMap以確保線程安全 */
private static final Map<String, HandleService> SERVICE_MAP = new ConcurrentHashMap<>();
static {
// 初始化存入HandleService實(shí)例
SERVICE_MAP.put("codeA", new HandleServiceImplA());
SERVICE_MAP.put("codeB", new HandleServiceImplB());
SERVICE_MAP.put("codeC", new HandleServiceImplC());
}
private static class SingletonHolder {
private static HandleServiceFactory instance = new HandleServiceFactory();
}
/**
* 獲取HandleServiceFactory的單例實(shí)例。
* 這個(gè)方法是靜態(tài)的,可以通過類名直接調(diào)用,而不需要先創(chuàng)建該類的實(shí)例。
* 它確保了整個(gè)應(yīng)用中只有一個(gè)HandleServiceFactory實(shí)例存在,符合單例模式的設(shè)計(jì)原則。
*
* @return 返回HandleServiceFactory的單例實(shí)例。
*/
public static HandleServiceFactory getInstance(){
return SingletonHolder.instance;
}
/**
* 根據(jù)給定的編碼獲取對(duì)應(yīng)的處理服務(wù)。
* <p>
* 注意:傳入的code不能為空。如果傳入的編碼沒有對(duì)應(yīng)的處理服務(wù),則拋出具體的異常。
*
* @param code
* @return 返回對(duì)應(yīng)代碼字符串的 HandleService 實(shí)例。
* @throws IllegalArgumentException 如果傳入的編碼沒有對(duì)應(yīng)的處理服務(wù),則拋出此異常。
*/
public static HandleService getHandleService(String code) throws IllegalArgumentException {
// 首先檢查code是否為null
if (code == null) {
throw new IllegalArgumentException("傳入的code不能為空");
}
// 從SERVICE_MAP中根據(jù)code獲取對(duì)應(yīng)的HandleService實(shí)例
HandleService handleService = SERVICE_MAP.get(code);
if (handleService == null) {
throw new IllegalArgumentException("沒有找到對(duì)應(yīng)編碼為[" + code + "]的HandleService實(shí)例");
}
return handleService;
}
public void handle(String code) {
getHandleService(code).doSomething();
}
}
使用:
public static void main(String[] args) {
HandleServiceFactory.getInstance().handle("codeC");
}
控制臺(tái)輸出如下:
執(zhí)行C計(jì)劃...
該文章在 2024/6/18 12:44:17 編輯過