優(yōu)化if-else代碼的八種方案
前言
代碼中如果if-else比較多,閱讀起來比較困難,維護起來也比較困難,很容易出bug,接下來,本文將介紹優(yōu)化if-else代碼的八種方案。

?
優(yōu)化方案一:提前return,去除不必要的else
如果if-else代碼塊包含return語句,可以考慮通過提前return,把多余else干掉,使代碼更加優(yōu)雅。
優(yōu)化前:
if (condition) {//doSomething} else {return;}
if(!condition){return;}//doSomething?
優(yōu)化方案二:使用條件三目運算符
int price;if (condition) {price = 80;} else {price = 100;}
int price = condition ? 80 : 100;?優(yōu)化方案三:使用枚舉
String OrderStatusDes;if (orderStatus == 0) {OrderStatusDes = "訂單未支付";} elseif ( OrderStatus == 1 ) {OrderStatusDes = "訂單已支付";} elseif ( OrderStatus == 2 ) {OrderStatusDes = "已發(fā)貨";}...
public?enum?OrderStatusEnum?{UN_PAID(0, "訂單未支付"),PAIDED(1, "訂單已支付"),SENDED(2, "已發(fā)貨"),??????;??????private?int?index;??????private?String?desc;public int getIndex() {return index;??????}public String getDesc() {return desc;}OrderStatusEnum(int index, String desc) {this.index = index;this.desc = desc;}??????OrderStatusEnum?of(int?orderStatus)?{for (OrderStatusEnum temp : OrderStatusEnum.values()) {if (temp.getIndex() == orderStatus) {return temp;}}return null;??????}}
String?OrderStatusDes?=?OrderStatusEnum.0f(orderStatus).getDesc();?
優(yōu)化方案四:合并條件表達式
double getVipDiscount () {if (age < 18) {return 0.8;}if ("深圳".equals(city)) {return 0.8;}if (isStudent) {return 0.8;}//do somethig}
double getVipDiscount(){if (age< 18 || "深圳".equals(city)||isStudent){return 0.8;}//doSomthing}
?
優(yōu)化方案五:使用 Optional
String str = "jay@huaxiao";if (str != null) {System.out.println(str);} else {System.out.println("Null");}
Optional<String> strOptional = Optional.of("jay@huaxiao");strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));
優(yōu)化方案六:表驅(qū)動法
if (param.equals(value1)) {doAction1(someParams);} else if (param.equals(value2)) {doAction2(someParams);} else if (param.equals(value3)) {doAction3(someParams);}// ...
Map, Function> action> actionMappings = new HashMap<>();// 這里泛型 ? 是為方便演示,實際可替換為你需要的類型// 初始化actionMappings.put(value1, (someParams) -> {doAction1(someParams)});actionMappings.put(value2, (someParams) -> {doAction2(someParams)});actionMappings.put(value3, (someParams) -> {doAction3(someParams)});// 省略多余邏輯語句actionMappings.get(param).apply(someParams);
優(yōu)化方案七:優(yōu)化邏輯結(jié)構(gòu),讓正常流程走主干
public double getAdjustedCapital () {????if?(_capital?<=?0.0)?{return 0.0;}if (_intRate > 0 && _duration > 0) {return (_income / _duration) * ADJ_FACTOR;????}return 0.0;}
public double getAdjustedCapital () {if (_capital <= 0.0) {return 0.0;}if (_intRate <= 0 || _duration <= 0) {return 0.0;}return (_income / _duration) * ADJ_FACTOR;}
?
優(yōu)化方案八:策略模式+工廠方法消除if else
String medalType = "guest";if ("guest".equals(medalType)) {System.out.println("嘉賓勛章");} else if ("vip".equals(medalType)) {System.out.println("會員勛章");} else if ("guard".equals(medalType)) {System.out.println("展示守護勛章");}...
//勛章接口public interface IMedalService {void showMedal ();String getMedalType ();}
//守護勛章策略實現(xiàn)類public class GuardMedalServiceImpl implements IMedalService {public void showMedal() {System.out.println("展示守護勛章");}public String getMedalType() {return "guard";}}//嘉賓勛章策略實現(xiàn)類public class GuestMedalServiceImpl implements IMedalService {public void showMedal() {System.out.println("嘉賓勛章");}public String getMedalType() {return "guest";}}//VIP勛章策略實現(xiàn)類public class VipMedalServiceImpl implements IMedalService {public void showMedal() {System.out.println("會員勛章");}public String getMedalType() {return "vip";}}
//勛章服務(wù)工產(chǎn)類public class MedalServicesFactory {private static final Mapmap = new HashMap<>(); static {map.put("guard", new GuardMedalServiceImpl());map.put("vip", new VipMedalServiceImpl());map.put("guest", new GuestMedalServiceImpl());}public static IMedalService getMedalService(String medalType) {return map.get(medalType);}}...
public class Test {public static void main(String[] args) {String medalType = "guest";IMedalService medalService = MedalServicesFactory.getMedalService(medalType);medalService.showMedal();}}
參考與感謝
6個實例詳解如何把if-else代碼重構(gòu)成高質(zhì)量代碼 如何 “干掉” if...else
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
評論
圖片
表情
