2012-06-19 4 views
6

Bedenkt man, dass einfacher Java-Code erstellen, die nicht funktionieren würden:ein Objekt vor dem Super-Aufruf in Java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

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

Ich brauche ein Objekt vor dem super() Aufruf zu schaffen, weil ich es in der Mutterklasse müssen schieben.

Ich möchte keine Initialisierungsbaustein verwenden und ich möchte nicht wie etwas tun:

super(new Foo(bar)) in meinem Konstruktor ..

Wie kann ich Daten auf eine Mutter-Klasse senden, bevor der Super Anruf?

+1

Was versuchen Sie zu tun? Was ist das größere Problem? – ametren

+7

Warum willst du nicht 'super (neues Foo (bar))' im Konstruktor? Und was ist das "Bar" im "Foo" -Konstruktor? – tibtof

+0

Ich möchte es nicht so machen, weil ich viele Felder im Konstruktor übergeben muss. –

Antwort

15

Wenn Foo in einem Feld gespeichert werden muss, können Sie dies tun:

public class Bar extends AbstractBar{  
    private final Foo foo; 

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

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

Ansonsten super(new Foo(bar)) Aussehen ziemlich legal für mich, können Sie new Foo(bar) in eine static Methode wickeln, wenn Sie möchten.

Beachten Sie auch, dass Feldinitialisierungen (wie in Ihrem Beispiel) und Initialisierungsblöcke auch nicht helfen, da sie nach dem Superklassenkonstruktor ausgeführt werden. Wenn das Feld als final deklariert ist, wird Ihr Beispiel nicht kompiliert, andernfalls erhalten Sie null im Konstruktor der Superklasse.

1

das ist nicht möglich in Java. Die einzige mögliche Lösung ist der neue Aufruf im Superkonstruktor.

wenn das foo-Objekt kann zwischen Instanzen gemeinsam genutzt werden können, Sie declar es als statisches

public class Bar extends AbstractBar{ 

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

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

, wenn die Superklasse unter Kontrolle ist, können Sie es Refactoring und die Template-Methode Muster verwenden, um das Objekt in ziehen den Konstruktor, anstatt ihn aus der Unterklasse zu pushen. diese applys das Hollywod Prinzip: Sie uns nicht an, wir rufen Sie zurück;)

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{...}