2010-09-18 21 views
2

我正在使用JDO查詢類,我需要有條件地將某些參數傳遞給execute方法,如下面的代碼所示。如何在Java中將參數有條件地傳遞給一個可變參數的方法?

我不知道如何在Java中做到這一點。

query.declareParameters("String alphaP"); 
query.declareParameters("String bravoP"); 
query.declareParameters("String charlieP"); 

if (condition == true) 
{ 
    if (othercondition == true) 
    { 
     query.declareParameters("List<String> stringList"); 
    } 
    else 
    { 
     query.declareParameters("String simpleString"); 
    } 
} 

if (someothercondition == true) 
{ 
    query.declareParameters("int deltaP"); 
} 

if (yetanothercondition == true) 
{ 
    query.declareParameters("int echoP"); 
} 

if (thelastcondition == true) 
{ 
    query.declareParameters("int foxtrotP"); 
} 

List<ResultClass> results = (List<ResultClass>) query.execute(
    alphaP, 
    bravoP, 
    charlieP, 

    ... whatever other parameters are required based on which conditions are true above 

    ); 

回答

4

我會建議使用executeWithArray方法:動態建立的參數使用java.util.ArrayList一個實例,然後可以使用toArray方法轉換爲數組的數組。該代碼可能類似於以下內容:

ArrayList<Object> args = new ArrayList<Object>(); 
args.add(alphaP); 
args.add(bravoP); 
args.add(charlieP); 
// Add other arguments here... 

List<ResultClass> results = (List<ResultClass>) query.executeWithArray(args.toArray()); 
+1

+1如果大家在提問之前檢查了API,我們在這裏沒有聲望。另外,executeWithMap可能會更簡單一些。 – 2010-09-18 00:34:11

4

如何在Java中有條件參數傳遞給採用可變數量的參數的方法?

@Richard回答了有關JDO Query類的具體問題。 (使用替代queryWith...方法之一。)

更一般的問題的答案是「它取決於」。具體而言,它取決於方法簽名。

1)如果該方法被聲明採取 可變數目的傳遞 爲陣列,列表參數,映射或什麼, 然後答案是顯而易見的。將 的實際參數組裝到一個數組/ list/map/whatever中,並傳遞它們。

2)如果該方法與 宣佈爲「可變參數」參數,那麼就可以通過 實際 參數的顯式陣列;例如

public void test(String... args) { ... } 

    test("Hi", "Mom"); 
    test(new String[]{"Hi", "Pa"}); 
    String[] args = new String[]{"Hi", "Bro"}; 
    test(args); 

3)如果確實有多個 重載的方法,那麼你有沒有 只好programmaticaly選擇 並調用相應的過載 基於參數的數量,你 必須通過:

public void test(String arg1) { ... } 
    public void test(String arg1, String arg2) { ... } 
    ... 

    if (nosArgs == 1) { 
     test(arg1); 
    } else if (nosArgs == 2) { 
     test(arg1, arg2); 
    } else ... 

你可能會認爲,思考會有所幫助,因爲當你調用一個方法反思你通過實際的參數作爲Object[]。但是這並沒有什麼幫助,因爲你還需要使用合適的對象,並且(比如說)test方法的每個重載都有一個不同的對象Method。所以你最終得到的條件/開關代碼等同於不反射的情況。

相關問題