如何避免在创建对象时调用构造函数?
答
只需提取要避免进入称为init,另一种方法intialization逻辑。你无法避免只调用一个构造函数。
答
无论您使用何种模式或策略,在某些时候,如果您想创建对象,您将需要调用构造函数。
答
事实上,在某些情况下,它可能会使用JVM实现中的类(它们不属于JRE API并且是实现特定的)。
一个例子这里http://www.javaspecialists.eu/archive/Issue175.html
它也应该可以使用sun.misc.Unsafe.allocateInstance()(Java7)
而且,使用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);
}
您能给出更多的背景吗?你为什么想这样做? – assylias 2013-02-13 11:37:39
简单的回答:不,这是不可能的。 – jlordo 2013-02-13 11:40:15
你想阻止你的类的用户执行'new MyClass()'和/或'new MyClass(args ...)'吗?你是这个意思吗 ? – A4L 2013-02-13 11:41:24