2012-07-08 34 views
3

我想避免的,如果其他人,在Java這樣的:在java中如何避免多重如果其他地圖爲isAssignableFrom

for (Class clazz : method.getParameterTypes()) { 
    if (SomeClass.class.isAssignableFrom(clazz)) { 
     arguments[i] = onearg; 
    } else if (SomeOtherClass.class.isAssignableFrom(clazz)) { 
     arguments[i] = someotherarg; 
    } 
} 

任何人都可以建議如何做到這一點?謝謝

+0

那麼你需要另一個邏輯。除了isAssignableFrom()之外的其他東西,但這取決於你對參數[i] = arg做了什麼。什麼樣的參數是,它是依賴於類的類型? – 2012-07-08 15:36:27

+0

是的,用戶可以定義訪問我將作爲參數的類的不同子類的方法,所以我需要將用戶在其插件中爲參數類定義的參數匹配到一組超類中,我知道他們正在oging使用。 – Jas 2012-07-08 15:46:33

+1

您可以安排一個'Map ',其中的值是要設置的參數值。然後在循環中遍歷該地圖的'entrySet'(只要找到匹配,您就可以「突破」)。 – 2012-07-08 15:50:19

回答

4

您可以將類和它們的參數存儲在Map<Class<?>, Object>中並迭代映射,這將通過帶有一個if語句的迭代循環替換if-else構造。

比如像這樣:

Map<Class<?>, Object> map = ... /* initialize */ 

for (Class cls : method.getParameterTypes()) { 
    for (Entry<Class<?>, Object> candidate : map.entrySet()) { 
      if (candidate.getKey().isAssignableFrom(cls)) { 
       arguments[i] = candidate.getValue() 
       break; // continue with the next parameter type 
      } 
    } 
} 

具體的實現依賴於你的類。如果地圖中的類有彼此之間沒有關係(例如超類,子類,接口等),則可以直接應用代碼。否則,如bestsss指出你應該堅持超類/接口迭代,以便保留類層次結構

進一步您可以調查到Java Annotations,但我不是100%確定如何將它們應用於您的情況下,沒有進一步的細節要求。你可以用參數

@Argument("onearg") 
public class SomeClass { 
    /* ... */ 
} 

註釋你的超類,並與cls.getSuperClass()得到迭代過程中的超類方法的參數類型和事後檢索註釋的參數值進行分配。

+0

我想你想用休息而不是繼續... – 2012-07-08 15:58:57

+0

@FranciscoSpaeth同意! – 2012-07-08 16:02:36

+0

地圖有什麼意義?如果你不使用'get()' - 這只是一個緩慢的集合。此外,現在沒有處理類的絕對順序,這意味着絕對扁平的層次結構(因爲它不能被強制執行)。最後:如果您將「繼續」更改爲「中斷」,請更改相應的評論。 – bestsss 2012-07-08 16:23:04