Javaでのオブジェクト作成中のコンストラクターの呼び出しを避けたい(デフォルトのコンストラクターまたはユーザー定義のコンストラクターのいずれか)。オブジェクトの作成中にコンストラクターの呼び出しを避けることは可能ですか???
前もって感謝します......
Javaでのオブジェクト作成中のコンストラクターの呼び出しを避けたい(デフォルトのコンストラクターまたはユーザー定義のコンストラクターのいずれか)。オブジェクトの作成中にコンストラクターの呼び出しを避けることは可能ですか???
前もって感謝します......
回避したい初期化ロジックを init という別のメソッドに抽出するだけです。コンストラクターを 1 つだけ呼び出すことは避けられません。
使用するパターンや戦略に関係なく、オブジェクトを作成する場合、ある時点でコンストラクターを呼び出す必要があります。
実際、状況によっては、JVM実装のクラス(JRE APIに属さず、実装固有)を使用することで可能になります。
ここに1つの例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);
}