在Java中聲明默認構造函數是否有意義?在Java中聲明默認構造函數有什麼意義嗎?
class MyClass {
public MyClass(){}
public MyClass(T someArgs){
//somecode
}
}
在Java中聲明默認構造函數是否有意義?在Java中聲明默認構造函數有什麼意義嗎?
class MyClass {
public MyClass(){}
public MyClass(T someArgs){
//somecode
}
}
是的,當你有其他的構造函數。
當你想 不傳遞任何 參數的構造函數創建對象這是必需的。
在大多數情況下,它需要 反射,尤其是當你工作 與某些基於反射的 框架和庫(例如串行,休眠,Hessian矩陣)。
使用setter來代替,一般來說 可以給你更好的控制。它還 與繼承(其中 你需要顯式調用 構造爲所有專業 類工作得很好,因爲構造函數是不是 虛。
如果你有一個非默認的構造函數,那麼默認的構造函數是不是隱含可用。這是一個好主意,不要把一個如果你的目標是不要有任何人做的事:
MyClass myClass = new MyClass();
的Java增加了一個默認的公共如果你指定沒有其他構造的無參數的構造所以有一點如果你需要一個,並指定另一個。所以你的情況,如果你確定你的類是這樣的:
class MyClass {
public MyClass(T someArgs){
//somecode
}
}
,那麼你可以這樣做:
MyClass a = new MyClass();
,但如果它是這樣定義的:
class MyClass {
// no constructors
}
你可以。
經常使用no-arg構造函數來指定僞默認參數。例如:
class Switch {
private boolean on;
public Switch() { this(true); }
public Switch(boolean on) { this.on = on; }
public boolean isOn() { return on; }
public boolean toggle() { on = !on; }
public boolean set(boolean on) { this.on = on; return this.on; }
}
某些框架將需要你有一個零。參數/默認構造函數。例如,你需要一個運行類作爲JUnit測試案例。[編輯:刪除不正確的語句]
這是由於它們使用反射
除了所有以前argum。因爲這些bean可以使用反射來創建(特別是通過調用Class.newInstance
),所以它是JavaBean的必需元素。因此,依賴於JavaBean的任何框架都會使這個無參數構造器成爲您體系結構的強制性部分。
還有一個額外的好處,因爲無參數構造函數可以幫助引入一種流暢的界面,讓你連續調用setter。舉個例子,在我公司工作了,是用來定義制定者身邊,用這樣的方法的getter:
class MyClass {
privaite int index;
public int getIndex() { return index; }
public void setindex(int index) { this.index = index; }
public MyClass withIndex(int index) {
setIndex(index);
return this;
}
}
讓我創建對象的方式如下:
MyClass myObject = new MyClass().withIndex(2);
這是一個創建對象而不定義錯誤構造函數的非常有用的方法。
不可序列化的對象不需要默認的構造函數。 – EJP 2010-03-12 11:23:26
你在某些情況下(但是,並非全部):http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html – ama 2010-03-12 11:29:55
請自己閱讀。可序列化的類不需要默認的構造函數。期。它是第一個需要默認構造函數的不可序列化的超類。 – EJP 2010-03-13 07:33:44