2012-06-19 24 views
6

süper aramadan önce bir nesne oluşturun: Ben anne sınıfında itin gerekir çünkü super() aramadan önce bir nesne oluşturmak için gerekenbasit java kod işe yaramaz olanı düşünüldüğünde java

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

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

.

Bir başlatma bloğu kullanmak istemiyorum ve ben böyle bir şey yapmak istemiyorum: my yapıcı içinde

super(new Foo(bar)) ..

nasıl önce bir anne sınıfına veri gönderebilir süper arama?

+1

? Daha büyük sorun nedir? – ametren

+7

Neden kurucuda süper (yeni Foo (bar)) 'istemiyorsunuz? Ve bu foo 'kurucusunda' bar' nedir? – tibtof

+0

Kurucuda geçmek alanların çok şey var çünkü bu şekilde yapmak istiyorum dont't .. –

cevap

15

Foo bir alanda depolanan gerekiyorsa, bunu yapabilirsiniz:

Aksi
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)) görünüyor istersen oldukça yasal benim için, bir static yöntem haline new Foo(bar) sarabilirsiniz.

Ayrıca, alan başlatıcılarının (örneğinizdeki gibi) ve başlatıcı bloklarının da, süper sınıf kurucusundan sonra çalıştıkları için yardımcı olmayacağını unutmayın. Alan derlemek olmaz final sizin örnek olarak ilan edilirse, aksi takdirde üst sınıf yapıcısı içinde null alırsınız. Yapmanız çalıştığımız şey

1

java mümkün değildir bu. mümkün olan tek çözüm, süper kurucudaki yeni çağrıdır. foo nesne örnekleri arasında paylaşılabilir eğer

süper sınıf sizin kontrolünüz altında ise o kadar statik

public class Bar extends AbstractBar{ 

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

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

, bunu planı ayrı declar ve içine nesneyi çekmek için Kalıp yönteminin kullanabilir alt sınıftan pusulamak yerine kurucu. Bu Hollywod prensip applys: bizi demiyorlar, sizi arayacak;)

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