作为一名在第一线搬砖的打工人,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 编辑过