2012-06-19 6 views
6

Teniendo en cuenta que el código de Java simple que no funcionaría:crear un objeto antes de la llamada de super en java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

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

Necesito crear un objeto antes de la llamada super() porque tengo que empujarla en la clase madre.

no quiero utilizar un bloque de inicialización y no quiero hacer algo como:

super(new Foo(bar)) en mi constructor ..

¿Cómo puedo enviar datos a una clase madre antes de la súper llamada?

+1

¿Qué estás tratando de hacer? ¿Cuál es el problema más grande? – ametren

+7

¿Por qué no quieres 'súper (nuevo Foo (barra))' en el constructor? ¿Y qué es esa 'barra' en el constructor' Foo'? – tibtof

+0

No quiero hacerlo de esa manera, porque tengo muchos campos para pasar en el constructor ... –

Respuesta

15

Si Foo tiene que ser almacenado en un campo, puede hacer esto:

public class Bar extends AbstractBar{  
    private final Foo foo; 

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

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

De lo contrario super(new Foo(bar)) miradas bastante legal para mí, puede envolver new Foo(bar) en un método static si lo desea.

También tenga en cuenta que los inicializadores de campo (como en su ejemplo) y los bloques de inicializador tampoco ayudarán, porque se ejecutan después del constructor de la superclase. Si el campo se declara como final, su ejemplo no se compilará; de lo contrario, obtendrá null en el constructor de la superclase.

1

eso no es posible en java. la única solución posible es la nueva llamada en el superconstructor.

si el objeto foo puede ser compartida entre instancias que pueden declar él como estática

public class Bar extends AbstractBar{ 

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

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

si la superclase está bajo su control, puede refactorizar y utilizar el patrón método de la plantilla para tirar del objeto en el constructor en lugar de sacarlo de la subclase. este applys el principio Hollywod: no nos llame, nosotros le llamaremos;)

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