我想在構造函數中進行測試,以確定當前是否使用給定的參數實例化對象。但是,我怎麼可以中止並從構造函數向新聲明返回一個警告?這些測試是否必須由每個「新」聲明前的調用者完成?我認爲構造函數將是一個很好的地方。構造函數可以中止實例嗎?
1
A
回答
8
您可以改用工廠對象。這可以運行你的檢查並返回實例化的對象,或者返回null。這可能比例外更有效。
MyObject myObject = MyObjectFactory.createMyObject();
2
的唯一可靠途徑中止對象的構造是構造
1
完成前,拋出異常你可以有構造函數拋出一個異常,如果參數無效。
如果這只是一個輸入有效性問題,調用者應該能夠檢查自己,你應該拋出一個RuntimeException
。如果調用者不一定能夠控制,構造函數應該拋出一個檢查異常;請注意,這將需要所有調用構造函數的代碼來處理或聲明異常。
4
是的,你在構造函數中拋出異常。
在java中你通常拋出一個IllegalArgumentException
如果其中一個參數是錯誤的這是真的作爲一個後衛聲明常有的事情:
public class Roman {
public Roman(int arabic) {
// "Guard statement" in the beginning of the constructor that
// checks if the input is legal
if (arabic < 0) {
throw new IllegalArgumentException("There are no negative roman numerals");
}
// Continue your constructor code here
}
}
如果你不想例外,你可以做GavinCatelli's answer並創建一個工廠方法,如果該對象不是「正確的」,則返回null。
public class RomanFactory {
public static Roman getSafeRoman(int a) {
Roman r;
try {
r = new Roman(a);
} catch(IllegalArgumentException e) {
r = null;
}
return r;
}
}
雖然您必須檢查null,否則程序可能會因NullPointerException異常而崩潰。
0
製作您自己的異常類,並相應地根據傳遞給構造函數的參數傳遞消息。因此從構造函數中拋出這個異常。
相關問題
- 1. 靜態構造函數以某種方式阻止實例構造函數
- 2. 在構造函數中計數實例
- 3. 我可以防止有一些例外的複製構造函數嗎?
- 4. 我們可以停止構造函數的運行嗎?
- 5. 構造函數可以在C++中調用另一個構造函數嗎?
- 6. C#實例構造函數與靜態構造函數
- 7. Rspec可以在循環構造中使用實例變量嗎?
- 8. 在C++中,構造函數和析構函數可以是內聯函數嗎?
- 9. 我應該在構造函數中實例化其他類嗎?
- 10. 數組,構造函數和實例
- 11. 可以在以下示例中通過* this構造函數
- 12. 我們可以解構任意的數據構造函數嗎?
- 13. 實例化繼承構造函數
- 14. 銷燬構造函數實例
- 15. 實例變量和構造函數
- 16. 區分javascript構造函數的實例
- 17. 沒有構造函數的實例C++
- 18. 構造函數可以返回java中的數據類型嗎?
- 19. 使用私有構造函數來防止類的實例化?
- 20. 禁止「不能實例非構造函數」警告
- 21. 我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
- 22. 是(Object)構造函數的所有對象實例嗎?
- 23. 原型是它的構造函數的一個實例嗎?
- 24. 以私有類實例作爲構造函數參數
- 25. 如果基類構造函數不是constexpr,我可以構造派生類constexpr的構造函數嗎?
- 26. std :: string可以在構造函數中分配嗎?
- 27. 構造函數可以從類中定義嗎?
- 28. C++:boost :: scoped_ptr可以在構造函數中初始化嗎?
- 29. 在PHP類的構造函數中運行查詢可以嗎?
- 30. 模型構造函數可以在Rails中爲空嗎?
+1,請不要在構造函數中拋出。 – 2012-04-01 15:05:11
是的,是練習工廠模式的好時機! – Tombola 2012-04-01 15:11:08