2012-06-19 2 views
6

Учитывая, что простой Java код, который не будет работать:создать объект до супер вызова в Java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

    public Bar(){ 
     super(foo); 
    } 
} 

Мне нужно создать объект перед super() вызова, потому что мне нужно, чтобы подтолкнуть ее в классе матери.

Я не хочу использовать блок инициализации, и я не хочу, чтобы сделать что-то вроде:

super(new Foo(bar)) в моем конструкторе ..

Как я могу отправить данные в маточном класса до супер-вызов?

+1

Что вы пытаетесь сделать? Какая большая проблема? – ametren

+7

Почему вы не хотите 'super (new Foo (bar))' в конструкторе? И что такое 'bar' в конструкторе' Foo'? – tibtof

+0

Я не хочу так поступать, потому что у меня есть много полей, которые нужно передать в конструкторе. –

ответ

15

Если Foo должен быть сохранен в поле, вы можете сделать это:

public class Bar extends AbstractBar{  
    private final Foo foo; 

    private Bar(Foo foo) { 
     super(foo); 
     this.foo = foo; 
    } 

    public Bar(){ 
     this(new Foo(bar)); 
    } 
} 

В противном случае super(new Foo(bar)) выглядит довольно законный для меня, вы можете обернуть new Foo(bar) в метод static, если хотите.

Также обратите внимание, что инициализаторы полей (как в вашем примере) и блоки инициализации тоже не помогут, поскольку они запускаются после конструктора суперкласса. Если поле объявлено как final, ваш пример не будет компилироваться, иначе вы получите null в конструкторе суперкласса.

1

это невозможно в java. единственным возможным решением является новый вызов супер-конструктора.

если объект Foo может быть разделена между экземплярами вы можете declar это как статические

public class Bar extends AbstractBar{ 

    private static final Foo foo = new Foo(bar); 

    public Bar(){ 
     super(foo); 
    } 
} 

если супер класс находится под вашим контролем, вы можете реорганизовывать и использовать шаблон метода шаблон тянуть объект в вместо того, чтобы вызывать его из подкласса. это в своей работе применяет hollywod принцип: не звоните нам, мы будем называть вас;)

public abstract class AbstractBar{ 

    private Object thing; 

    public AbstractBar(){ 
     this.thing = this.createThatThing();    
    } 

    protected abstract Object createThatThing(); 
} 

public class Bar extends AbstractBar { 

    // no constructor needed 

    protected Object createThatThing(){ 
      return new Thing(); 
    } 
} 
1
class AbstractBar{ 
    public AbstractBar() { 
    } 
    public AbstractBar(Foo t) { 
    } 
} 
class Bar extends AbstractBar{ 
    static Foo t=null; 
    public Bar() { 
     super(t=new Foo()); 
    } 
} 
class Foo{...} 

 Смежные вопросы

  • Нет связанных вопросов^_^