1

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

提前致谢......

4

4 回答 4

2

无论您使用什么模式或策略,如果您想创建一个对象,在某些时候您都需要调用构造函数。

于 2013-02-13T11:41:06.300 回答
2

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

于 2013-02-13T11:37:50.587 回答
0

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

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

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

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

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

于 2013-02-13T14:31:23.027 回答
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);
}
于 2013-02-13T16:20:58.200 回答