簡體   English   中英

如何在對象創建過程中避免構造函數調用?

[英]How to Avoid Constructor calling During Object Creation?

我想避免在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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM