2014-09-22 36 views
2
public class Foo{ 
    private String a; 
    private int b; 

    public Foo(Foo foo){ 
     this.a = foo.a; 
     this.b = foo.b; 
    } 
} 

大家好。有一個類本身作爲構造函數的唯一參數

我在工作中做了一小部分代碼..我的同事看到了這一點,並給了我「你不應該呼吸」的樣子,出去約30分鐘冷靜下來。 (我是一個新的畢業生)

我一直在試圖找出什麼是我犯的可恥的錯誤..這是不成功的。

請問有人請解釋爲什麼這是一個不好的做法(或白癡)?

我這樣做的原因是該類有許多參數,我不希望每次需要初始化此對象時都要傳遞3行參數(使用基本參數)。我們需要傳遞一個實體類(它使用的是實體類而不是實體類)來初始化一個事務對象(正如我們在工作中所稱的那樣)。

我也有一個默認的構造函數。

謝謝!

+6

它被稱爲_copy constructor_,我看不出有什麼本質上可恥它創建Foo類的實例;它比依靠_clone_好得多; http://stackoverflow.com/questions/2427883/clone-vs-copy-constructor-which-is-recommended-in-java – 2014-09-22 10:49:02

+0

你將如何使用這個構造函數? '新Foo(新Foo(新Foo(...))''? – stuXnet 2014-09-22 10:49:33

+1

您至少需要一個默認構造函數或工廠方法或類似的東西。正如guido所說,如果你想製作一個克隆,那麼帶有這個類的構造函數是非常有用的。 – stuXnet 2014-09-22 10:51:04

回答

5

拷貝構造函數沒有什麼不對您的代碼。其實你做了什麼有一個名字:copy constructor 而且它是非常方便的方法使o複製另一個對象。 (假設除了這個構造函數,還有其他方法可以創建它的實例)

+0

非常感謝你的回答..我只是錯過了正確的詞彙。現在我搜索Java的複製構造函數,我發現這個鏈接,我認爲是製作複製構造函數的最佳方法。你怎麼看? http://www.javapractices.com/topic/TopicAction.do?Id=12 – moamzia 2014-09-22 10:55:47

+0

他的代碼可能沒有問題。當初始構造函數除了初始化字段之外還有其他一些東西時,例外是:當使用這樣的複製構造函數時,他可能會錯過初始化的一部分。 – 2014-09-22 11:05:12

1

這是非編碼。你需要類的實例來創建實例...你想如何創建這個對象的第一個實例?

2

你只有1層的構造,所以爲了創造Foo類的一個對象,你需要傳遞給構造一個Foo,爲了創建Foo你將需要另一個Foo,它會繼續下去。例如,對於例如代碼,代碼可以更有意義。你將不得不在類默認構造函數,然後你構造器

public Foo(Foo foo){ 
    this.a = foo.a; 
    this.b = foo.b; 
} 

會更像在

+0

我確實有一個默認的構造函數,對不起。 – moamzia 2014-09-22 10:52:31

+0

因此,在這種情況下,你的代碼沒有問題 – sol4me 2014-09-22 10:53:17

1

構造函數當您想使用new關鍵字創建一個實例時獲取調用。所有的類都有一個默認的構造函數,就像classname(){}

在你的例子中你有一個單獨的構造函數。因此,你的類的默認構造函數不再存在。 你有唯一的構造函數現在是

public Foo(Foo foo){} 

按照你的源代碼必須通過美孚的一個實例來創建Foo類的一個新實例。 所以,你可以嘗試

Foo fooObj = new Foo(new Foo(new Foo(.......)) 

正如你可以看到,這將永遠不會結束。

您可以傳遞null作爲參數傳遞給構造器

Foo fooObj = new Foo(null) 

但由於您使用的參考Foo對象的實例變量來啓動新富的值對象將不能工作。

你應該做的是將默認的構造函數添加到你的類。

public class Foo{ 
    private String a; 
    private int b; 

    public Foo(){} 

    public Foo(Foo foo){ 
     this.a = foo.a; 
     this.b = foo.b; 
    } 
} 

然後你可以如下

Foo f1 = new Foo(); 
f1.setA("ABC"); // create getters and setters 
f1.setB(12); 

Foo f2 = new Foo(f1); 
+0

你說的是有道理的..我沒有提到默認構造函數是我的錯,因爲我在實際代碼中有一個默認的構造函數。請閱讀我在@ user1427708的回答中評論的內容 – moamzia 2014-09-22 11:01:28

相關問題