天天看點

JAVA應用之if-else 的優化

作者:bug的搬運工
  1. 使用多态或政策模式:将條件判斷轉換為對象的行為,減少 if-else 的使用。
public interface DiscountStrategy {
    double applyDiscount(double amount);
}

public class SeniorDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        // 計算老年人優惠後的價格
        return amount * 0.9;
    }
}

public class StudentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        // 計算學生優惠後的價格
        return amount * 0.8;
    }
}

public class DiscountCalculator {
    private DiscountStrategy discountStrategy;

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateDiscount(double amount) {
        return discountStrategy.applyDiscount(amount);
    }
}

// 使用示例
DiscountCalculator calculator = new DiscountCalculator();
calculator.setDiscountStrategy(new SeniorDiscountStrategy());
double discountedPrice = calculator.calculateDiscount(100.0);
           
  1. 使用工廠模式:通過工廠類建立對象,避免直接使用 if-else 進行對象的建立。
public interface DiscountStrategy {
    double applyDiscount(double amount);
}

public class SeniorDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        // 計算老年人優惠後的價格
        return amount * 0.9;
    }
}

public class StudentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        // 計算學生優惠後的價格
        return amount * 0.8;
    }
}

public class DiscountStrategyFactory {
    public static DiscountStrategy createDiscountStrategy(String userType) {
        if (userType.equalsIgnoreCase("senior")) {
            return new SeniorDiscountStrategy();
        } else if (userType.equalsIgnoreCase("student")) {
            return new StudentDiscountStrategy();
        }
        return null;
    }
}

// 使用示例
DiscountStrategy discountStrategy = DiscountStrategyFactory.createDiscountStrategy("senior");
double discountedPrice = discountStrategy.applyDiscount(100.0);
           
  1. 使用 Map 或政策映射:将條件與對應的操作存儲在 Map 中,根據條件查找對應的操作進行執行。
public class DiscountCalculator {
    private Map<String, DiscountStrategy> discountStrategies;

    public DiscountCalculator() {
        discountStrategies = new HashMap<>();
        discountStrategies.put("senior", new SeniorDiscountStrategy());
        discountStrategies.put("student", new StudentDiscountStrategy());
    }

    public double calculateDiscount(String userType, double amount) {
        DiscountStrategy discountStrategy = discountStrategies.get(userType);
        if (discountStrategy != null) {
            return discountStrategy.applyDiscount(amount);
        }
        return amount;
    }
}

// 使用示例
DiscountCalculator calculator = new DiscountCalculator();
double discountedPrice = calculator.calculateDiscount("senior", 100.0);           

4、使用枚舉優化

public enum DiscountType {
    SENIOR {
        @Override
        public double applyDiscount(double amount) {
            // 計算老年人優惠後的價格
            return amount * 0.9;
        }
    },
    STUDENT {
        @Override
        public double applyDiscount(double amount) {
            // 計算學生優惠後的價格
            return amount * 0.8;
        }
    };

    public abstract double applyDiscount(double amount);
}

// 使用示例
DiscountType discountType = DiscountType.SENIOR;
double discountedPrice = discountType.applyDiscount(100.0);
           

通過枚舉類型,可以将不同條件的操作邏輯封裝在枚舉常量中,使用起來更加簡潔和易于擴充。

繼續閱讀