簡體   English   中英

多個if語句的設計方法?

[英]Design approach for multiple if else statement?

我有將sql查詢返回為字符串的方法。 此方法考慮參數'level',基於此參數有多個if else語句,例如

   if(level.equals("A1")){
    // add some  field in query
   }
   else if (level.equals("A2"))
   {
    // add some  field  and logic in query
   }
   ..

   so on 

將來級別的數量將增加,如果不想使用其他語句,我不想​​寫討厭的東西,因此我正在尋找一種更干凈,可維護的設計方案。 我正在考慮策略設計模式,但不確定是否適合這種情況。

您有幾種選擇:

  1. if / else if如您所指示。

  2. 一個switch語句

  3. 可以使用方法引用lambdas ,匿名類實例或java.util.function初始化的Map ,其鍵為級別字符串,值為功能接口類型( Runnablejava.util.function的適當接口,或您自己的接口)的引用甚至需要的具體類實例。

這是最后一個選項的示例,該示例使用最基本的功能接口Runnable以及方法引用:

import java.util.Map;
import java.util.HashMap;

public class Example {
    private Map<String, Runnable> handlers;

    public Example() {
        this.handlers = new HashMap<String, Runnable>();
        this.handlers.put("A1", this::a1action);
        this.handlers.put("A2", this::a2action);
    }

    private void a1action() {
        System.out.println("Action A1");
    }

    private void a2action() {
        System.out.println("Action A2");
    }

    public void handleAction(String action) {
        Runnable handler = this.handlers.get(action);
        if (handler == null) {
            System.out.println("No handler for '" + action + "'");
        } else {
            handler.run();
        }
    }

    public static void main(String[] args) throws Exception {
        Example ex = new Example();
        ex.handleAction("A1");
        ex.handleAction("A2");
        ex.handleAction("A3");
    }
}

您可以使用enum列出操作,並使用valueOf確定要使用的操作。

enum Levels {
    A1 {
        @Override
        void doSomethingToTheQuery(Query q) {
            // add some  field in query
        }
    },
    A2{
        @Override
        void doSomethingToTheQuery(Query q) {
            // add some  field  and logic in query
        }
    };

    abstract void doSomethingToTheQuery(Query q);
}

public void test() {
    // Lookup the level and do hack the query.
    Levels.valueOf("A1").doSomethingToTheQuery(q);
}

然后,只需添加到enum即可添加新級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM