ホームページ  >  記事  >  Java  >  Java で if-else をエレガントに記述する方法

Java で if-else をエレガントに記述する方法

WBOY
WBOY転載
2023-04-29 22:04:191507ブラウズ

1. switch

switch メソッドは列挙値の処理に良い影響を与えます。たとえば、ステータス値には制限があるため、注文ステータスごとに異なる処理を行う必要があります。状態ごとに異なる処理を行う場合:

元のステートメント

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("订单已签收");
        }
    }

要約:

switch ステートメントは限定された判定条件に適しています。複雑な計算の後は、単純なステートメントでシナリオを処理する必要はありません。判定条件に複雑な計算が必要な場合や、処理文のロジックが比較的複雑な場合は、別の処理方法を検討する必要がありますが、やはりケース内に処理文を大量に記述するのは快適ではありません。 #2. 機能インターフェイス

より複雑な処理ロジックを扱う場合、これらの処理ロジックを 1 つのメソッドで処理するのではなく、個別に分離することを好みます。全体的な読みやすさと切り離しも、私たちが導き出したパターンです。関数型インターフェースを使って if else を処理する

関数型インターフェースのマップ処理 if else の本質は、各条件の複雑な処理ロジックを個別に抽出することであり、統一された判定条件によって異なるメソッドを呼び出す関数型インターフェースメソッドです。例は次のとおりです。

@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;
    }

}

呼び出しの際、区別するために if else を使用する必要はありません。パラメータを関数マップに直接渡して呼び出します

   @Autowired
    private FunctionInterfaceStrategy functionInterfaceStrategy;
    
    
    functionInterfaceStrategy.doOperation("参数",1);

もちろん、上で示したとおりです。は、パラメータと戻り値を備えた関数型インターフェイスです。実際の運用では、他の形式の関数型インターフェイスも必要になる場合があります。参照用に個別にリストします。

#インターフェイス名説明メソッドの呼び出しサプライヤーパラメータなし、戻り値ありget#パラメータはありますが、戻り値はありません##accept#runFunctionパラメータがある場合は戻り値がありますapplyストラテジの形式を解決するパターンパターンは、実装メソッドがより複雑で、処理ロジックを分離する必要があるクリーンなシナリオに適しています。
#Consumer
Runnable パラメータなし、戻り値なし
3. 戦略パターン 上記の関数インターフェース形式は実際にはメソッドを分離しており、実装メソッドは依然としてクラス内に配置されています。 FunctionInterfaceStrategy クラスでの依存性注入を通じて他のクラスのメソッドを再び使用すると、このパターンは、次に使用するメソッド、つまりストラテジを使用する方法にすでに近づいています。if else
1. まず、後続の実装クラスの形式を指定するために使用されるインターフェイス クラス を作成する必要があります。

public interface OrderStrategy {

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

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

}

2. 次に、判定条件ごとに実装クラスを作成します##
@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;
    }
}
##3. 実装クラスをホストするストラテジファクトリークラスを作成します

@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);
    }

}
##4. メソッド呼び出し

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

    private final OrderStrategyFactory orderStrategyFactory;

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

}

要約:

上記のコード例を通して、関数型インターフェイスと戦略パターンは同様のアプローチをとっていることがわかりますが、根本的な違いは、実装メソッドを実装に個別に抽出する必要があるかどうかです。クラス。抽出粒度が細かくなるほど、分離が強化されます。

ストラテジ モードを使用します。後で if else 条件を追加する必要がある場合は、実装クラスを追加するだけで済みます。これは後続の処理に便利です

最終的にどれを使用するかは、具体的なビジネス状況によって異なります

4. ガード ステートメント

メソッドの前にさまざまなパラメータのネスト判定ロジックを処理する必要があることがよくあります。この場合、ガード文を使用して処理することをお勧めします

元の文

    public void before(Integer status) {
        if(status != null) {
            if(status != 0){
                if(status == 1){
                    System.out.println("订单未接单");
                }
            }
        }
    }

ガード文

    public void greater(Integer status) {
        if(status == null){
            return;
        }
        if(status != 0){
            return;
        }
        if(status == 1){
            System.out.println("订单未接单");
        }
    }

以上がJava で if-else をエレガントに記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。