2013-02-13 2 views
1

Я хочу избежать вызова конструктора при создании объекта в java (либо конструктор по умолчанию, либо определенный пользователем конструктор). Можно ли избежать вызова конструктора при создании объекта ???Как избежать вызова конструктора при создании объекта?

Заранее спасибо ......

+4

Можете ли вы дать немного больше фона? Почему вы хотите это сделать? – assylias

+1

Простой ответ: Нет, это невозможно. – jlordo

+0

Вы хотите, чтобы пользователи вашего класса не делали 'new MyClass()' и/или 'new MyClass (args ...)'? это то, что вы имели ввиду ? – A4L

ответ

2

Просто распаковывать логику intialization, что вы хотите, чтобы избежать в другой метод, называемый инициализации. Вы не можете избежать вызова только одного конструктора.

2

Независимо от того, какой шаблон или стратегия вы используете, в какой-то момент вам нужно будет вызвать конструктор, если вы хотите создать объект.

0

Фактически, это возможно при некоторых обстоятельствах, используя классы из реализации JVM (которые не относятся к JRE API и не являются специфичными для реализации).

Одним из примеров здесь http://www.javaspecialists.eu/archive/Issue175.html

Это также должно быть возможно с помощью sun.misc.Unsafe.allocateInstance() (Java7)

Кроме того, конструктор, по-видимому обойден при использовании клона() - метод для создайте копию объекта (и класс не переопределяет клон, чтобы реализовать его иначе, чем метод 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); 
} 
Смежные вопросы