Java - 使构造函数不带参数必需

时间:2016-03-22 22:10:59

标签: java constructor

有没有办法让没有参数的构造函数成为必需的?

我认为这个例子会奏效。你有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构造函数不是强制性的,或者确保该类提到了构造函数。

3 个答案:

答案 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
    }
}