我想避免在 java 中创建对象期间调用构造函数(默认构造函数或用户定义的构造函数)。是否可以避免在对象创建期间调用构造函数???
提前致谢......
无论您使用什么模式或策略,如果您想创建一个对象,在某些时候您都需要调用构造函数。
只需将您想要避免的初始化逻辑提取到另一个名为 init 的方法中。你不能避免只调用一个构造函数。
实际上,在某些情况下,可以使用 JVM 实现中的类(不属于 JRE API 并且是特定于实现的)。
这里有一个例子http://www.javaspecialists.eu/archive/Issue175.html
也应该可以使用 sun.misc.Unsafe.allocateInstance() (Java7)
此外,在使用 clone() 方法创建对象的副本时,构造函数显然被绕过(并且该类不会覆盖 clone 以实现与 Object.clone() 方法不同的方法)。
所有这些可能性都附带条件,如果有的话,应该小心使用。
您可以模拟类的构造函数。它们仍然会被调用,但不会被执行。例如,下面的 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);
}