我的课程有点像这样:
public class Test {
private final List<ISomeType> things = new LinkedList<ISomeType>();
public <T extends ISomeType> Test(Class<T> clazz, int order) {
for (int i = 0; i < order; i++) {
try {
this.things.add(clazz.newInstance());
} catch (Exception e) {
// stackoverflowers use your imagination
}
}
}
}
我期望并希望Class clazz有一个可访问的无参数构造函数。有没有什么办法可以在编译时强制它出现?
答案 0 :(得分:4)
在编译时无法强制执行构造函数要求。在运行时,您可以检查class.getConstructors()并确保有一个没有args(或者只是像示例代码一样捕获异常)。
通常,no-arg构造函数要求只列在基类或接口的Javadoc中。
答案 1 :(得分:2)
有一些代码样式验证工具可以扩展以检查这种类型的需求。对于eclipse(和其他人),PMD可以帮助你。通过查看教程,我认为您应该能够编写一个特定的规则来检查没有任何参数的构造函数。
答案 2 :(得分:2)
这个怎么样?
interface Provider<T> {
T get();
}
public class Test {
private final List<ISomeType> things = new LinkedList<ISomeType>();
public <T extends ISomeType> Test(Provider<T> provider, int order) {
for (int i = 0; i < order; i++) {
try {
this.things.add(provider.get());
} catch (Exception e) {
// stackoverflowers use your imagination
}
}
}
}
答案 3 :(得分:1)
您最好的选择是创建一个单元测试,为您关注的每个类检查这个,然后在构建时运行单元测试。或者,您可以创建一个测试类 - 不与您的代码一起分发 - 除了运行您关注的类的无参数构造函数之外什么都不做。不是一个很好的选择。
答案 4 :(得分:1)
下面的链接显示了如何使用Java 6和注释处理工具解决类似情况(检查特定类的子类是否都具有无参数构造函数):
也许你可以调整他们的解决方案来解决你的问题。
答案 5 :(得分:-2)
反思是关于在运行时而不是编译时做事。如果您希望代码有效,请不要使用反射。