2011-08-28 43 views
4

我已經看到API的設計,他們有時接受類類型作爲參數傳遞。 對於例如[A]:何時應該接受類類型作爲參數?

class AClass { 
//details 
} 

class Someclass { 

public void someMethod(class klass, int num) { 
// some code 
} 

} 

class client { 

public static void main(String[] args) { 
    Someclass obj = new Someclass(); 
    obj.someMethod(AClass.class, 10); // some sample use cases of client 
} 

} 

現在在Java中,通過類的是不是在所有必需的,如果可能,以獲得來自對象的類型,如下面並[b]

class AClass { 
//details 
} 

class Someclass { 

public void someMethod(AClass obj, int num) { 
// some code 
} 

} 

class client { 

public static void main(String[] args) { 
    Someclass obj = new Someclass(); 
    AClass aclassObj = new Aclass(); 
    obj.someMethod(aclassObj, 10); 
} 

} 
解釋

我也可以改變的someMethod(的參數),並使用下面給出[C]

public void someMethod(Object obj, int num) { 

if(obj instanceof AClass) { 
    //do something 
} 

} 

所以我們時應選擇設計如圖[A]而不是[b]? [a]中有關於設計的一般原則需要考慮。

PS:有些API的設計一樣,顯示如下

Quartz example

回答

1

幾個明顯的答案是:

  1. 任何時間的方法實際上並不把對象作爲參數(例如,當您從DI框架或工廠請求一個類型的實例時,例如您在提供的Quartz示例中)。
  2. 任何時候您傳入的參數都可能爲空,因此您無法在其上調用getType,並且instanceof不會指示該對象爲instanceof任何類型。

所以它有道理採取class參數時,所討論的方法要麼需要產生問題的類的實例或提供有關類,它不應該要求一個實例被創建一些元數據。

唯一的其他考慮我想指出的是,它是可以使用泛型接受類參數時,如Guice的Injector接口下面的方法簽名:

<T> T getInstance(Class<T> type); 

注意如何使方法來聲明它正在返回一個與您作爲類參數傳入的相同類型的對象,因此您不需要在之後投射該對象。您還可以使用通用通配符(Class<? extends Foo>)來限制可以傳入方法的類的類型。

+0

似乎#2,它會更好只是做'if(x = null)'而不是添加參數。 –

+0

@MikeG:這取決於你希望用x做什麼。如果您需要了解x的類型,則不能調用x.getClass,如果x爲null,instanceof將始終返回false。 – StriplingWarrior

0

如果需要它進行處理,則傳遞類描述(一個Class對象)。如果需要對象進行處理,則傳遞一個對象(這是該類的一個實例)。

+0

我有些懷疑。希望你能清楚給我。做一些處理的類對象和做對象處理的對象(類的實例)有什麼區別?那麼你是說「類的靜態方法」還是「類的非靜態方法」? – nibin012

0

另一個例子是here - 其中返回的對象(在本例中是列表中的對象)的類型取決於類的類型。

許多需要它的實例現在可能會被設計一個使用泛型的API取代,但對於某些問題,它仍然提供簡潔和易於理解的語法。

相關問題