作為一名在第一線搬磚的打工人,if...else幾乎是最常見的代碼了。下面我們一起來看一下如何干掉if...else吧,看看你掌握幾種。
1. 提前 return
這種方法一般只適合分支結構很簡單的if...else,我們可以提前 return,比如一些參數校驗。
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();
}
}
對于這種代碼可以利用 Optional 可以非常優雅地解決。
❝Optional類是 Java 8 中引入的一個用于處理可能為 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 = "已發貨";
} else if ("4".equals(status)) {
status = "已簽收";
} else if ("5".equals(status)) {
status = "已評價";
}
return status;
}
這種類型的代碼非常適合枚舉來解決。先定義一個枚舉類:
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
UN_PAID("1","未支付"),
PAID("2","已支付"),
SEND("3","已發貨"),
SING("4","已簽收"),
EVALUATE("5","已評價");
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);
}
}
有了這個枚舉,上面代碼直接可以優化為一行代碼:
String orderStatusDes = Optional.ofNullable(OrderStatusEnum.getDes("3")).map(e -> e.getStatusDes()).orElse("");
4. 策略模式 + 工廠方法
假設有如下代碼:
if ("codeA".equals(code)) {
doSomethingA();
} else if ("codeB".equals(code)) {
doSomethingB();
} else if ("codeC".equals(code)) {
doSomethingC();
}
可以使用使用策略模式 + 工廠方法來優化,首先創建一個處理的策略接口:
public interface HandleService {
void doSomething();
}
具體的策略實現類:
public class HandleServiceImplA implements HandleService {
@Override
public void doSomething() {
System.out.println("執行A計劃...");
}
}
public class HandleServiceImplB implements HandleService {
@Override
public void doSomething() {
System.out.println("執行B計劃...");
}
}
public class HandleServiceImplC implements HandleService {
@Override
public void doSomething() {
System.out.println("執行C計劃...");
}
}
工廠類,統一調度,用來管理這些策略,如下:
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實例
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的單例實例。
* 這個方法是靜態的,可以通過類名直接調用,而不需要先創建該類的實例。
* 它確保了整個應用中只有一個HandleServiceFactory實例存在,符合單例模式的設計原則。
*
* @return 返回HandleServiceFactory的單例實例。
*/
public static HandleServiceFactory getInstance(){
return SingletonHolder.instance;
}
/**
* 根據給定的編碼獲取對應的處理服務。
* <p>
* 注意:傳入的code不能為空。如果傳入的編碼沒有對應的處理服務,則拋出具體的異常。
*
* @param code
* @return 返回對應代碼字符串的 HandleService 實例。
* @throws IllegalArgumentException 如果傳入的編碼沒有對應的處理服務,則拋出此異常。
*/
public static HandleService getHandleService(String code) throws IllegalArgumentException {
// 首先檢查code是否為null
if (code == null) {
throw new IllegalArgumentException("傳入的code不能為空");
}
// 從SERVICE_MAP中根據code獲取對應的HandleService實例
HandleService handleService = SERVICE_MAP.get(code);
if (handleService == null) {
throw new IllegalArgumentException("沒有找到對應編碼為[" + code + "]的HandleService實例");
}
return handleService;
}
public void handle(String code) {
getHandleService(code).doSomething();
}
}
使用:
public static void main(String[] args) {
HandleServiceFactory.getInstance().handle("codeC");
}
控制臺輸出如下:
執行C計劃...
該文章在 2024/6/18 12:44:17 編輯過