2013-02-13 166 views
1

我想避免在java中创建对象时使用构造函数(默认构造函数或用户定义的构造函数)。是否有可能在创建对象时避免构造函数调用?如何避免在创建对象时调用构造函数?

在此先感谢......

+4

您能给出更多的背景吗?你为什么想这样做? – assylias 2013-02-13 11:37:39

+1

简单的回答:不,这是不可能的。 – jlordo 2013-02-13 11:40:15

+0

你想阻止你的类的用户执行'new MyClass()'和/或'new MyClass(args ...)'吗?你是这个意思吗 ? – A4L 2013-02-13 11:41:24

回答

2

只需提取要避免进入称为init,另一种方法intialization逻辑。你无法避免只调用一个构造函数。

2

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

0

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

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

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

而且,使用clone()时的构造显然是绕过 - 方法创建一个对象的副本(并且该类不覆盖克隆以实现与Object.clone()方法不同的方法)。

所有这些可能性都附带了字符串,应该小心使用,如果有的话。

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); 
} 
相关问题