1

Javaでのオブジェクト作成中のコンストラクターの呼び出しを避けたい(デフォルトのコンストラクターまたはユーザー定義のコンストラクターのいずれか)。オブジェクトの作成中にコンストラクターの呼び出しを避けることは可能ですか???

前もって感謝します......

4

4 に答える 4

2

回避したい初期化ロジックを init という別のメソッドに抽出するだけです。コンストラクターを 1 つだけ呼び出すことは避けられません。

于 2013-02-13T11:37:50.587 に答える
2

使用するパターンや戦略に関係なく、オブジェクトを作成する場合、ある時点でコンストラクターを呼び出す必要があります。

于 2013-02-13T11:41:06.300 に答える
0

実際、状況によっては、JVM実装のクラス(JRE APIに属さず、実装固有)を使用することで可能になります。

ここに1つの例http://www.javaspecialists.eu/archive/Issue175.html

sun.misc.Unsafe.allocateInstance()(Java7)を使用して実行することもできます。

また、clone()メソッドを使用してオブジェクトのコピーを作成する場合、コンストラクターは明らかにバイパスされます(また、クラスは、Object.clone()メソッドとは異なる方法でクローンを実装するためにクローンをオーバーライドしません)。

これらの可能性はすべて、紐が付いているので、使用する場合は慎重に使用する必要があります。

于 2013-02-13T14:31:23.027 に答える
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);
}
于 2013-02-13T16:20:58.200 に答える