2010-10-07 51 views
5

這就是我想要做的(在Java中1.6):如何在Java中實現構造函數包裝?

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

編譯器說:

call to this must be first statement in constructor 

有什麼解決方法嗎?

回答

17

你需要實現這樣的:

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方法應該是靜態的,因爲對應於this的對象不是可在您所呼叫的方法點。

順便說一句,這種方法的優點是它不會一個完全初始化Bar對象傳遞給Foo(Bar)。 (@RonU指出,他的做法沒有。當然,這意味着他的Foo(Bar)構造不能想當然地認爲其Foo說法是最終狀態,這可能是有問題。)

最後,我同意,一個靜態工廠方法這是一種很好的替代方法。

+0

這是否真的回答第二個構造函數上的郵件? – RonU 2010-10-07 12:47:47

+3

*回覆郵件* ??? – 2010-10-07 12:51:59

+0

@RonU - 國際海事組織,我的回答直接解決了OP的問題。如果您不同意,請解釋原因。 – 2010-10-07 13:18:11

5

可以實施「默認構造函數」作爲一個靜態工廠方法:

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

像它說,這個()的調用必須在構造函數來發生的第一件事情。這有什麼理由不起作用嗎?

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

它可能會工作,但它是屁股 - 醜陋的:-) – 2010-10-07 12:51:24

+0

沒有關於這個的爭論。對我而言,這些情況往往會變成我所要求的那樣 - 我真的想要那個構造函數,通常答案是否定的,因爲我認爲這是錯誤的。我寧願讓實例化器傳遞一個完全配置的Bar(第二個構造函數),然後繼續。 – RonU 2010-10-07 13:05:47

+2

這是行不通的,因爲'Foo(Bar b)'可能對'b'做一些操作,這必須在'b'初始化後發生。 – yegor256 2010-10-08 09:48:59