2012-04-01 28 views
1

我想在構造函數中進行測試,以確定當前是否使用給定的參數實例化對象。但是,我怎麼可以中止並從構造函數向新聲明返回一個警告?這些測試是否必須由每個「新」聲明前的調用者完成?我認爲構造函數將是一個很好的地方。構造函數可以中止實例嗎?

回答

8

您可以改用工廠對象。這可以運行你的檢查並返回實例化的對象,或者返回null。這可能比例外更有效。

MyObject myObject = MyObjectFactory.createMyObject(); 
+2

+1,請不要在構造函數中拋出。 – 2012-04-01 15:05:11

+0

是的,是練習工廠模式的好時機! – Tombola 2012-04-01 15:11:08

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

製作您自己的異常類,並相應地根據傳遞給構造函數的參數傳遞消息。因此從構造函數中拋出這個異常。

相關問題