2012-06-19 14 views
6

Considerando che semplice codice Java, che non avrebbe funzionato:creare un oggetto prima della chiamata di super in java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

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

ho bisogno di creare un oggetto prima della chiamata super() perché ho bisogno di spingerlo nella classe madre.

Non voglio utilizzare un blocco di inizializzazione e io non voglio fare qualcosa di simile:

super(new Foo(bar)) nel mio costruttore ..

Come posso inviare i dati a una classe madre prima della super chiamata?

+1

Che cosa stai cercando di fare? Qual è il problema più grande? – ametren

+7

Perché non vuoi 'super (new Foo (bar))' nel costruttore? E cos'è la 'bar' nel costruttore' Foo'? – tibtof

+0

Non voglio farlo in questo modo, perché ho un sacco di campi da passare nel costruttore .. –

risposta

15

Se Foo deve essere conservato in un campo, si può fare questo:

public class Bar extends AbstractBar{  
    private final Foo foo; 

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

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

Altrimenti super(new Foo(bar)) sguardi abbastanza legale per me, è possibile avvolgere new Foo(bar) in un metodo static se si desidera.

Nota anche che gli inizializzatori di campo (come nel tuo esempio) e i blocchi di inizializzazione non saranno di aiuto, perché corrono dopo il costruttore della superclasse. Se il campo è dichiarato come final, il tuo esempio non verrà compilato, altrimenti riceverai null nel costruttore della superclasse.

1

questo non è possibile in java. l'unica soluzione possibile è la nuova chiamata nel super costruttore.

se l'oggetto foo può essere condiviso tra le istanze si possono declar come statico

public class Bar extends AbstractBar{ 

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

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

se la classe Super è sotto il vostro controllo, è possibile refactoring e utilizzare il modello di metodo di template per tirare l'oggetto in il costruttore invece di pusing dalla sottoclasse. questo applys il principio Hollywod: non chiamare noi, vi chiameremo;)

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