2012-12-17 55 views

回答

3

這取決於。

如果你的類可以正確地使用null傳遞給構造函數並繞過初始化,那麼它就可以。

如果你的班級不行,拋出一個異常,如果不是檢查異常,那麼通常是IllegalArgumentException


看起來好像這種構造是有用的構造相當於一個:

MyClass o = new MyClass(); 
o.doSomethingWithString(str); 

如果是的話,更好的方法可能是使用了fluent interface模式,其中方法返回this(如果可能),那麼你可以代碼:

MyClass o = new MyClass().doSomethingWithString(str); 

這裏,方法doSomethingWithString(),而不是被宣佈爲void,具有返回類型和最後一行將是return this;。這種模式對於連接調用方法很方便,例如o.doX().setY(y).doZ();

+0

我相信有人利用漏洞仍然可以採取部分對象,並在運行時注入自己的代碼。 – Woot4Moo

1

如果構造函數不能將該對象置於有用狀態,那麼最可能防範的契約是構造函數拋出異常。

假設呼叫者將檢查任何內部錯誤標誌是危險的。

推遲引發異常只會從實際故障點消除故障點,使得找到根本原因更加困難。

1

從構造函數返回時,它仍然創建對象,但在返回後不會初始化代碼的其餘部分。如果你的課可以正常行事,那就沒問題。如果啓動剩餘部分非常重要,但不能,請爲發件人拋出異常,以便知道出現了問題。

2

這可能會更好。

public class MyClass { 
    public MyClass(String str) { 
     if (null == str){ 
      throw new YourException("Your message"); 
     } 
     mStr = processInput(str); 
     mMember1 = initMember1(); 
     // ... some other initialization 
} 

IMO,從構造函數返回是一種不好的做法。 :)

0

您需要做的第一件事是標記該類final。然後你可以繼續處理局部對象,你想要做的就是拋出類似SecurityExceptionIllegalStateException。我通常傾向於SecurityException,因爲它表明有人可能會惡意地拿走那個部分對象並做壞事。使用final將有助於防止某人擴展部分對象並在您的系統中運行橫行。

相關問題