ホームページ > Java > &#&チュートリアル > Java で if-else をエレガントに記述する方法

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

WBOY
リリース: 2023-04-29 22:04:19
転載
1529 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート