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

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール
