gpt4 book ai didi

java - 什么时候方法应该接受类类型作为参数?

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:01 25 4
gpt4 key购买 nike

我见过 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. 任何时候该方法实际上并未将对象作为参数(例如,当您从 DI 框架或工厂请求类型的实例时,例如在您提供的 Quartz 示例中)。
  2. 任何时候你传入的参数可能为空,所以你不能调用getType在上面,和instanceof不会指示该对象是 instanceof任何类型。

所以采取 class 是有意义的当所讨论的方法需要生成所讨论类的实例或提供有关该类的一些元数据时,该参数不需要创建实例。

我要指出的唯一其他考虑因素是,在接受类参数时可以使用泛型,如 Guice 的 Injector 上的以下方法签名所示。接口(interface):

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

注意这如何允许该方法声明它正在返回一个与您作为类参数传入的类型相同的对象,因此您之后不需要强制转换该对象。您还可以使用通用通配符 (Class<? extends Foo>) 来限制可以传递到方法中的类的类型。

关于java - 什么时候方法应该接受类类型作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com