2011-08-28 58 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取代,但对于某些问题,它仍然提供简洁和易于理解的语法。

相关问题