2010-10-07 29 views
5

Bu benim (Java 1.6 olarak) yapmaya çalışıyorum budur:Java'da yapıcı sarıcı nasıl uygulanır?

public class Foo { 
    public Foo() { 
    Bar b = new Bar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    this(b); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
} 

Derleyici diyor: Herhangi bir geçici çözüm

call to this must be first statement in constructor 

var mı?

cevap

17

Böyle uygulamak gerekir:

public class Foo { 
    public Foo() { 
    this(makeBar()); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
    private static Bar makeBar() { 
    Bar b = new Bar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    return b; 
    } 
} 

makeBar yöntem statik olmalıdır this tekabül nesne yöntemi aradığınız noktada kullanılabilir durumda olmadığından. Bu arada

, bu yaklaşım Foo(Bar) için tam olarak başlatılmış Bar nesne geçmek yapar avantajına sahiptir. (@RonU onun yaklaşımı değil belirtiyor. Tabii ki bu onun Foo(Bar) yapıcı onun Foo argüman son durumunda. Bu problemlidir edilebilir olduğunu kabul anlamına gelir.)

Son olarak, statik bir fabrika yöntemi olduğunu kabul Bu yaklaşıma iyi bir alternatif. diyor gibi

public class Foo { 
    public static Foo createFooWithDefaultBar() { 
    Bar b = new Bar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    return new Foo(b); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
} 
+0

Bu gerçekten ikinci kurucudaki postayı yanıtlıyor mu? – RonU

+3

* postayı yanıtla * ??? –

+0

@RonU - IMO, cevabım OP'nin sorusunu doğrudan ele alıyor. Eğer katılmıyorsanız, lütfen nedenini açıklayın. –

5

Statik bir fabrika yöntemi olarak "varsayılan kurucu" uygulayabilir. Bunun işe yaramayacağı bir sebep var mı?

public class Foo { 
    public Foo() { 
    this(new Bar()); 
    Bar b = getBar(); 
    b.setSomeData(); 
    b.doSomethingElse(); 
    } 
    public Foo(Bar b) { 
    // ... 
    } 
} 
-1

bu çağrısı() bir kurucu gerçekleşmesi gereken ilk şey olmalıdır:

+0

Bu işe yarayabilir, ama butt-çirkin :-) –

+0

Bunun hakkında tartışma yok. Benim için bu durumlar çoğu zaman benim istediğim do-I-gerçekten-istiyorum-bu-yapıcıya dönüşüyor ve bu sorunun yanlış olduğunu düşündüğümden genelde cevap hayır. Anlıklaştırıcıyı tam olarak yapılandırılmış bir Çubuğa (ikinci yapıcı) geçirmeyi ve devam etmeyi tercih ederim. – RonU

+2

Bu işe yaramaz çünkü 'Foo (Bar b)' 'b' ile başlatıldıktan sonra gerçekleşmesi gereken bazı işlemleri yapabilir. – yegor256