最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java如何消除太多的if else判斷示例代碼

 更新時(shí)間:2020年05月11日 14:11:09   作者:孫華棟  
這篇文章主要介紹了java如何消除太多的if else判斷,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.簡(jiǎn)介

if判斷語(yǔ)句是很多編程語(yǔ)言的重要組成部分。但是,若我們最終編寫了大量嵌套的if語(yǔ)句,這將使得我們的代碼更加復(fù)雜和難以維護(hù)。

讓我們看看能否使用別的方式來(lái)做呢。

設(shè)計(jì)模式是為了更好的代碼重用性,可讀性,可靠性,可維護(hù)性,它有六大原則:

  • 單一職責(zé)原則(Single Responsibility Principle,簡(jiǎn)稱SRP):該原則是針對(duì)類來(lái)說(shuō)的,即一個(gè)類應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé).
  • 開(kāi)放--封閉原則(The Open-Closed Principle簡(jiǎn)稱OCP):是說(shuō)軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以擴(kuò)展,但是不可以修改。
  • 依賴倒轉(zhuǎn)原則(Dependence Inversion Principle :針對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程
  • 里氏代換原則(Liskov Substitution Principle,簡(jiǎn)稱LSP):里氏代換原則,子類型必須能夠替換掉他們的父類型
  • 迪米特法則(Law of Demeter):如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用
  • 合成/聚合復(fù)用原則(Composition/Aggregation Principle],簡(jiǎn)稱CARP):盡量使用合成/聚合,盡量不使用類繼承。合成聚合是“has  a”的關(guān)系,而繼承是“is  a”的關(guān)系。

2.示例if..else

public int calculate(int a, int b, String operator) {
 int result = Integer.MIN_VALUE;

 if ("add".equals(operator)) {
 result = a + b;
 } else if ("multiply".equals(operator)) {
 result = a * b;
 } else if ("divide".equals(operator)) {
 result = a / b;
 } else if ("subtract".equals(operator)) {
 result = a - b;
 } else if ("modulo".equals(operator)) {
 result = a % b;
 }
 return result;
}

switch-case

public int calculateUsingSwitch(int a, int b, String operator) {
 int result = 0;
 switch (operator) {
 case "add":
 result = a + b;
 break;
 case "multiply":
 result = a * b;
 break;
 case "divide":
 result = a / b;
 break;
 case "subtract":
 result = a - b;
 break;
 case "modulo":
 result = a % b;
 break;
 default:
 result = Integer.MIN_VALUE;
 }
 return result;
}

3.重構(gòu)

3.1 工廠方式重構(gòu)

抽象層Operation.java

public interface Operation {
 int apply(int a, int b);
}

加法實(shí)現(xiàn)Addition.java:

public class Addition implements Operation {
 @Override
 public int apply(int a, int b) {
 return a + b;
 }
}

減法實(shí)現(xiàn)Subtraction.java

public class Subtraction implements Operation {
 @Override
 public int apply(int a, int b) {
 return a - b;
 }
}

乘法實(shí)現(xiàn)Multiplication.java

public class Multiplication implements Operation {
 @Override
 public int apply(int a, int b) {
 return a\*b;
 }
}

除法實(shí)現(xiàn)Division.java

public class Division implements Operation {
 @Override
 public int apply(int a, int b) {
 return a / b;
 }
}

求余實(shí)現(xiàn)Modulo.java

public class Modulo implements Operation {
 @Override
 public int apply(int a, int b) {
 return a % b;
 }
}

工廠類OperatorFactory.java

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class OperatorFactory {
 static Map<String, Operation> operationMap = new HashMap<>();
 
 static {
 operationMap.put("add", new Addition());
 operationMap.put("divide", new Division());
 operationMap.put("multiply", new Multiplication());
 operationMap.put("subtract", new Subtraction());
 operationMap.put("modulo", new Modulo());
 }

 public static Optional<Operation> getOperation(String operation) {
 return Optional.ofNullable(operationMap.get(operation));
 }
}

使用示例

public int calculateUsingFactory(int a, int b, String operator) {
 Operation targetOperation = OperatorFactory
 .getOperation(operator)
 .orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
 return targetOperation.apply(a, b);
}

3.2 枚舉方式重構(gòu)

枚舉實(shí)現(xiàn)Operator.java

public enum Operator {
 ADD {
 @Override
 public int apply(int a, int b) {
  return a + b;
 }
 },
 MULTIPLY {
 @Override
 public int apply(int a, int b) {
  return a * b;
 }
 },
 SUBTRACT {
 @Override
 public int apply(int a, int b) {
  return a - b;
 }
 },
 DIVIDE {
 @Override
 public int apply(int a, int b) {
  return a / b;
 }
 },
 MODULO {
 @Override
 public int apply(int a, int b) {
  return a % b;
 }
 };
 public abstract int apply(int a, int b);
}

封裝Operator到Calculator.java

public int calculate(int a, int b, Operator operator) {
 return operator.apply(a, b);
}

使用示例

@Test
public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {
 Calculator calculator = new Calculator();
 int result = calculator.calculate(3, 4, Operator.valueOf("ADD"));
 assertEquals(7, result);
}

3.3 命令模式

抽象的接口

public interface Command {
 Integer execute();
}

實(shí)現(xiàn)類

package com.baeldung.reducingIfElse;

public class AddCommand implements Command {

 private int a;
 private int b;

 public AddCommand(int a, int b) {
 this.a = a;
 this.b = b;
 }

 @Override
 public Integer execute() {
 return a + b;
 }
}

其它略
包裝

public int calculate(Command command) {
 return command.execute();
}

測(cè)試demo

@Test
public void whenCalculateUsingCommand_thenReturnCorrectResult() {
 Calculator calculator = new Calculator();
 int result = calculator.calculate(new AddCommand(3, 7));
 assertEquals(10, result);
}

3.4 規(guī)則引擎重構(gòu)

抽象規(guī)則

public interface Rule {
 boolean evaluate(Expression expression);
 Result getResult();
}

實(shí)現(xiàn)規(guī)則AddRule.java 其它略

public class AddRule implements Rule {
 private int result;
 @Override
 public boolean evaluate(Expression expression) {
 boolean evalResult = false;
 if (expression.getOperator() == Operator.ADD) {
  this.result = expression.getX() + expression.getY();
  evalResult = true;
 }
 return evalResult;
 }
 @Override
 public Result getResult() {
 return new Result(result);
 }
}

其中:返回結(jié)果

public class Result {
 int value;

 public Result(int value) {
  this.value = value;
 }

 public int getValue() {
  return value;
 }
}

表達(dá)式

public class Expression {
 private Integer x;
 private Integer y;
 private Operator operator;
 public Expression(Integer x, Integer y, Operator operator) {
  this.x = x;
  this.y = y;
  this.operator = operator;
 }
 public Integer getX() {
  return x;
 }
 public Integer getY() {
  return y;
 }
 public Operator getOperator() {
  return operator;
 }
}

規(guī)則引擎RuleEngine.java

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class RuleEngine {
 private static List<Rule> rules = new ArrayList<>();
 static {
  rules.add(new AddRule());
 }
 public Result process(Expression expression) {
  Rule rule = rules.stream()
   .filter(r -> r.evaluate(expression))
   .findFirst()
   .orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
  return rule.getResult();
 }
}

測(cè)試demo

@Test
public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
 Expression expression = new Expression(5, 5, Operator.ADD);
 RuleEngine engine = new RuleEngine();
 Result result = engine.process(expression);
 assertNotNull(result);
 assertEquals(10, result.getValue());
}

4.比較

重構(gòu)方式 SRP OCP DIP LSP LD CARP
IF/ELSE N N N N N N
工廠方法 Y Y Y Y Y Y
枚舉方法 N Y Y Y Y Y
命令模式 Y Y Y Y Y Y
規(guī)則引擎 Y Y Y Y Y Y

5.小結(jié)

  為了更好的代碼重用性,可讀性,可靠性,可維護(hù)性,我們會(huì)嘗試將IF/ELSE或者case-switch進(jìn)行改造,使用工廠方法,枚舉方法,命令模式,規(guī)則引擎方式不同方法進(jìn)行嘗試,最后使用設(shè)計(jì)模式的六大原則對(duì)代碼進(jìn)行評(píng)估。

到此這篇關(guān)于java如何消除太多的if else判斷的文章就介紹到這了,更多相關(guān)java if else 判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis之多參數(shù)查詢方式

    mybatis之多參數(shù)查詢方式

    這篇文章主要介紹了mybatis之多參數(shù)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    這篇文章主要介紹了Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Spring Boot Logback配置日志過(guò)程解析

    Spring Boot Logback配置日志過(guò)程解析

    這篇文章主要介紹了Spring Boot Logback配置日志過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 淺談Java父子類加載順序

    淺談Java父子類加載順序

    本文主要介紹了Java父子類加載順序,那么這么長(zhǎng)怎么記呀?本文就幫大家總結(jié)一下,更有利于記憶,感興趣的可以了解一下
    2021-08-08
  • Nacos配置中心集群原理及源碼分析

    Nacos配置中心集群原理及源碼分析

    這篇文章主要為大家介紹了Nacos配置中心集群原理及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • 用IDEA如何打開(kāi)文件夾

    用IDEA如何打開(kāi)文件夾

    這篇文章主要介紹了用IDEA如何打開(kāi)文件夾問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 淺談Java內(nèi)存模型之happens-before

    淺談Java內(nèi)存模型之happens-before

    于存在線程本地內(nèi)存和主內(nèi)存的原因,再加上重排序,會(huì)導(dǎo)致多線程環(huán)境下存在可見(jiàn)性的問(wèn)題。那么我們正確使用同步、鎖的情況下,線程A修改了變量a何時(shí)對(duì)線程B可見(jiàn)?下面小編來(lái)簡(jiǎn)單介紹下
    2019-05-05
  • 關(guān)于String.format()格式化輸出方式

    關(guān)于String.format()格式化輸出方式

    String.format()是Java的格式化輸出方法,支持多種數(shù)據(jù)類型和格式化選項(xiàng),它在格式化和拼接字符串時(shí)具有較高的靈活性,但效率相對(duì)較低,特別是在處理大量數(shù)據(jù)時(shí),在實(shí)際編程中,應(yīng)根據(jù)具體需求選擇合適的字符串拼接方式
    2024-12-12
  • 基于Java實(shí)現(xiàn)計(jì)數(shù)排序,桶排序和基數(shù)排序

    基于Java實(shí)現(xiàn)計(jì)數(shù)排序,桶排序和基數(shù)排序

    這篇文章主要為大家詳細(xì)介紹了計(jì)數(shù)排序,桶排序和基數(shù)排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java),感興趣的小伙伴可以了解一下
    2022-12-12
  • Java ConcurrentModificationException異常解決案例詳解

    Java ConcurrentModificationException異常解決案例詳解

    這篇文章主要介紹了Java ConcurrentModificationException異常解決案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

大渡口区| 自治县| 聊城市| 巩义市| 洛川县| 莎车县| 宁夏| 麦盖提县| 建德市| 荔浦县| 景德镇市| 孝感市| 德令哈市| 沐川县| 湘乡市| 无为县| 辽源市| 华阴市| 襄城县| 长治县| 阳江市| 抚顺县| 安龙县| 衡南县| 沁源县| 清远市| 顺义区| 天津市| 育儿| 泽普县| 新余市| 都昌县| 宿松县| 兴山县| 庄浪县| 于都县| 石嘴山市| 罗平县| 临颍县| 南澳县| 北票市|