有没有办法让没有参数的构造函数成为必需的?
我认为这个例子会奏效。你有A班和B班:
public class A {
public A() {
//do something
}
}
public class B extends A {
public B(int number) {
//do something with number
}
}
但是你不能调用B b = new B();
,因为B类没有没有参数的构造函数。它只有带编号的构造函数。
我只是在java中使用反射,并希望从类(class.newInstance()
)实例化对象。但要像这样实例化,您需要没有参数的构造函数。
我现在不是在询问反思。我只是想知道是否有一种方法可以使arg构造函数不是强制性的,或者确保该类提到了构造函数。
答案 0 :(得分:1)
这样做的方法是,如果你在B
中提供了一个no-arg构造函数,它将number
设置为某个合理的默认值(或者让Java将其设置为0)。
public class B extends A {
public B(int number) {
//do something with number
}
public B() {
// set number to a sane default
}
}
除此之外,没有其他方法可以完成你所要求的。如果你编写任何形式的构造函数,即使是没有参数的构造函数,也不再考虑Java的隐式no-arg构造函数。
答案 1 :(得分:1)
如果我正确理解了这个问题,你想强制所有类都有一个零arg / default构造函数。如果没有使用Reflections library
的构造函数的任何类,您可以添加一个失败的测试@Test
public void ensureAllClassesInPackageTempHaveAZeroArgConstructor() throws Exception {
List<ClassLoader> classLoadersList = new LinkedList<>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("temp"))));
for (Class<?> clazz : reflections.getSubTypesOf(Object.class)) {
boolean hasZeroArgConstructor = Arrays.asList(clazz.getConstructors()).stream().anyMatch(c -> c.getParameterCount() == 0);
if (! hasZeroArgConstructor) {
Assert.fail(String.format("%s doesn't have a zero arg constructor", clazz.getCanonicalName()));
}
}
}
答案 2 :(得分:0)
我认为你可以在这种情况下使用构造函数重载:
public class A {
public A() {
//do something
}
}
public class B extends A {
public B(int number) {
//do something with number
}
public B() {
//do something with number
}
}