如何在对象创建过程中避免构造函数调用?

时间:2013-02-13 11:36:36

标签: java

我想避免在java中创建对象期间的构造函数调用(默认构造函数或用户定义的构造函数)。在对象创建期间是否可以避免构造函数调用?

提前致谢......

4 个答案:

答案 0 :(得分:2)

只需将要避免的初始化逻辑提取到另一个名为unit的方法中。你无法避免只调用一个构造函数。

答案 1 :(得分:2)

无论您使用何种模式或策略,如果您想创建对象,您都需要调用构造函数。

答案 2 :(得分:0)

实际上,在某些情况下可以使用JVM实现中的类(不属于JRE API并且是特定于实现的)。

这里有一个例子http://www.javaspecialists.eu/archive/Issue175.html

也应该可以使用sun.misc.Unsafe.allocateInstance()(Java7)

此外,当使用clone()方法创建对象的副本时,显然绕过了构造函数(并且该类不会覆盖clone以实现它与Object.clone()方法不同)。

所有这些可能性都带有附加条件,如果有的话应该小心使用。

答案 3 :(得分:0)

您可以模拟类的构造函数。它们仍将被调用,但不会被执行。例如,以下JUnit + JMockit测试执行此操作:

static class CodeUnderTest
{
    private final SomeDependency someDep = new SomeDependency(123, "abc");

    int doSomething(String s)
    {
        someDep.doSomethingElse(s);
        return someDep.getValue(); 
    }
}

static final class SomeDependency
{
    SomeDependency(int i, String s) { throw new RuntimeException("won't run"); }
    int getValue() { return -1; }
}

@Test
public void mockEntireClassIncludingItsConstructors()
{
    new NonStrictExpectations() {
        @Mocked SomeDependency mockDep;
        { mockDep.getValue(); result = 123; }
    };

    int result = new CodeUnderTest().doSomething("testing");

    assertEquals(123, result);
}