Heim  >  Artikel  >  Java  >  Wie man if-else elegant in Java schreibt

Wie man if-else elegant in Java schreibt

WBOY
WBOYnach vorne
2023-04-29 22:04:191507Durchsuche

1. switch

Die Switch-Methode hat einen guten Einfluss auf die Verarbeitung von Aufzählungswerten. Für unterschiedliche Auftragsstatus müssen beispielsweise unterschiedliche Verarbeitungen durchgeführt werden, da die Statuswerte begrenzt sind. dann können wir switch direkt verwenden, um unterschiedliche Verarbeitungen für verschiedene Zustände durchzuführen:

Originalaussage

public void before(Integer status) {
        if(status == 1){
            System.out.println("订单未接单");
        }else if(status == 2){
            System.out.println("订单未发货");
        }else if(status == 3){
            System.out.println("订单未签收");
        }else{
            System.out.println("订单已签收");
        }
    }

switch

public void greater(Integer status) {
        switch (status){
            case 1:
                System.out.println("订单未接单");
                break;
            case 2:
                System.out.println("订单未发货");
                break;
            case 3:
                System.out.println("订单未签收");
                break;
            default:
                System.out.println("订单已签收");
        }
    }

Zusammenfassung:

# 🎜🎜 Die #switch-Anweisung eignet sich für Szenarien, in denen die Beurteilungsbedingungen begrenzt sind, keine komplexen Berechnungen erforderlich sind und die Verarbeitungsanweisung einfach ist. Wenn unsere Beurteilungsbedingungen eine Reihe komplexer Berechnungen erfordern oder die Logik der Verarbeitungsanweisungen relativ komplex ist, müssen wir andere Verarbeitungsmethoden in Betracht ziehen. Schließlich ist das Schreiben vieler Verarbeitungsanweisungen in dem Fall nicht bequem. 🎜🎜#2. Funktionsschnittstelle

Wenn es um komplexere Verarbeitungslogiken geht, ziehen wir es vor, diese Verarbeitungslogiken separat zu trennen, anstatt sie in einer Methode zu verarbeiten, was die allgemeine Lesbarkeit und Entkopplung erhöht Dort haben wir auch das Muster abgeleitet, funktionale Schnittstellen zur Verarbeitung von „if else“ zu verwenden Verschiedene Methoden werden über einheitliche Beurteilungsbedingungen aufgerufen. Die spezifischen Beispiele lauten wie folgt:

@Component
public class FunctionInterfaceStrategy {

    /**
     * key 方法参数,多个参数可以自定义一个实体类处理
     * value 方法返回值
     */
    private Map<Integer, Function<Object,Boolean>> operationMap;

    @PostConstruct
    private void init(){
        operationMap = new HashMap<>();
        operationMap.put(1,this::takeOrder);
        operationMap.put(2,this::sendOrder);
        operationMap.put(3,this::signOrder);
        operationMap.put(4,this::finishOrder);
    }

    public Boolean doOperation(Object params,Integer status){
        return operationMap.get(status) == null || operationMap.get(status).apply(params);
    }

    private Boolean takeOrder(Object params){
        // TODO 比较复杂的处理逻辑
        System.out.println("订单未接单");
        return true;
    }

    private Boolean sendOrder(Object params){
        // TODO 比较复杂的处理逻辑
        System.out.println("订单未发货");
        return true;
    }

    private Boolean signOrder(Object params){
        // TODO 比较复杂的处理逻辑
        System.out.println("订单未签收");
        return true;
    }

    private Boolean finishOrder(Object params){
        // TODO 比较复杂的处理逻辑
        System.out.println("订单已签收");
        return true;
    }

}

Beim Aufruf ist es nicht erforderlich, „if else“ zur Unterscheidung zu verwenden. Rufen Sie die Parameter direkt in die Funktionszuordnung auf. 🎜🎜#
   @Autowired
    private FunctionInterfaceStrategy functionInterfaceStrategy;
    
    
    functionInterfaceStrategy.doOperation("参数",1);

Was wir oben gezeigt haben, ist natürlich eine funktionale Schnittstelle mit Parametern und Rückgabewerten. In der tatsächlichen Produktion benötigen wir möglicherweise auch andere Formen von funktionalen Schnittstellen, die wir separat auflisten Referenz

Schnittstellenname

BeschreibungAufrufmethode#🎜🎜 #SupplierKeine Parameter, Rückgabewert getMit Parametern, kein RückgabewertacceptRunnableFunktion3. StrategiemusterDie Form der oben genannten Funktionsschnittstelle ist eigentlich Methoden sind getrennt, und alle Implementierungsmethoden werden immer noch in einer Klasse platziert. Selbst wenn Sie Methoden anderer Klassen erneut durch Abhängigkeitsinjektion in der FunctionInterfaceStrategy-Klasse aufrufen können, nähert sich dieses Modell bereits dem an, was wir tun möchten. Die nächste Methode besteht darin, das zu lösen wenn sonstDie Form des Strategiemusters eignet sich für Situationen, in denen die Implementierungsmethode komplexer ist, und für sauberere Szenarien, in denen die Verarbeitungslogik entkoppelt werden muss
public interface OrderStrategy {

    /**
     * 获取实现类标识
     * @return
     */
    Integer getType();

    /**
     * 逻辑处理
     * @param params
     * @return
     */
    Boolean handler(Object params);

}
@Service
public class SendOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 2;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 复杂的处理逻辑
        System.out.println("订单未发货");
        return true;
    }
}

@Service
public class SignOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 3;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 复杂的处理逻辑
        System.out.println("订单未签收");
        return true;
    }
}

@Service
public class TakeOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 1;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 复杂的处理逻辑
        System.out.println("订单未接单");
        return true;
    }
}
Zusammenfassung:
# 🎜🎜#Consumer#🎜 🎜#
#🎜 🎜#Keine Parameter, nein Rückgabewert run
Bei Parametern gibt es einen Rückgabewert#🎜 🎜##🎜 🎜#apply
# 🎜🎜#1. Wir müssen eine Schnittstellenklasse erstellen, um das Format unserer nachfolgenden Implementierungsklassen anzugeben Strategie-Factory-Klasse zum Hosten der Implementierungsklasse4. Methodenaufruf
Durch das obige Codebeispiel können Sie Stellen Sie tatsächlich fest, dass die funktionale Schnittstelle und das Strategiemuster ähnliche Ansätze haben. Der grundlegende Unterschied besteht darin, ob die Implementierungsmethode separat in eine Implementierungsklasse extrahiert werden muss. Je feiner die Extraktionsgranularität, desto stärker ist die Entkopplung.

Wenn Sie später if else-Bedingungen hinzufügen müssen, müssen Sie nur die Implementierungsklasse hinzufügen, was für die nachfolgende Verarbeitung praktischer ist.# 🎜🎜 #

Welches letztendlich zu verwenden ist, hängt von der spezifischen Geschäftssituation ab.

4. Schutzanweisung

Wir müssen häufig verschiedene Parameterverschachtelungen vor der Beurteilungslogik verarbeiten , wenn die Bedingungen nicht erfüllt sind, wird es direkt zurückgegeben. In diesem Fall wird eher empfohlen, die Guard-Anweisung zu verwenden, um

Original-Anweisung

@Component
@AllArgsConstructor
public class OrderStrategyFactory {

    private final List<OrderStrategy> orderStrategyList;

    private static Map<Integer,OrderStrategy> strategyMap = new HashMap<>();

    @PostConstruct
    private void init(){
        for (OrderStrategy orderStrategy : orderStrategyList) {
            strategyMap.put(orderStrategy.getType(),orderStrategy);
        }
    }

    /**
     * 执行方法
     * @param status
     * @param params
     * @return
     */
    public Boolean handler(Integer status,Object params){
        return strategyMap.get(status).handler(params);
    }

}

Guard-Anweisung zu verwenden

@RestController
@RequestMapping("ifelse")
@AllArgsConstructor
public class IfElseController {

    private final OrderStrategyFactory orderStrategyFactory;

    @GetMapping("strategy")
    public Boolean strategy(Integer status){
        return orderStrategyFactory.handler(status,"1");
    }

}

Das obige ist der detaillierte Inhalt vonWie man if-else elegant in Java schreibt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen