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. 機能インターフェイス
関数型インターフェースのマップ処理 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 | #Consumer | #パラメータはありますが、戻り値はありません|
Runnable | パラメータなし、戻り値なし | #run|
Function | パラメータがある場合は戻り値があります | apply |
3. 戦略パターン | 上記の関数インターフェース形式は実際にはメソッドを分離しており、実装メソッドは依然としてクラス内に配置されています。 FunctionInterfaceStrategy クラスでの依存性注入を通じて他のクラスのメソッドを再び使用すると、このパターンは、次に使用するメソッド、つまりストラテジを使用する方法にすでに近づいています。if else |
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; } }
@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); } }
@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 サイトの他の関連記事を参照してください。