2013-02-13 114 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); 
} 
相關問題