問題

所以,在Java中,您的建構函式HAS的第一行是對super的呼叫...無論是隱式呼叫super()還是顯式呼叫另一個建構函式.我想知道的是,為什麼我不能圍繞這個設定一個嘗試塊?

我的具體情況是我有一個測試的模擬類.沒有預設建構函式,但我想讓一個更簡單地讀取測試.我還想將建構函式丟擲的異常包裝到RuntimeException中.

所以,我想做的是有效地這樣做:

 public class MyClassMock extends MyClass {
    public MyClassMock() {
        try {
            super(0);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // Mocked methods
}
 

但Java抱怨超級語句不是第一個語句.

我的解決方法:

 public class MyClassMock extends MyClass {
    public static MyClassMock construct() {
        try {
            return new MyClassMock();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public MyClassMock() throws Exception {
        super(0);
    }

    // Mocked methods
}
 

這是最好的解決方法嗎?為什麼Java不讓我做前者?


我對“為什麼”的最佳猜測是,Java不想讓我有一個可能不一致的狀態的構造物件...但是,在進行模擬時,我不在乎這一點.似乎我應該能夠做到上述....或者至少我知道上面的內容對我的情況來說是安全的.....或者似乎應該是無論如何的.

我正在覆蓋我從測試類中使用的任何方法,所以我沒有使用未初始化變數的風險.

  最佳答案

不幸的是,編譯器無法在理論原則上工作,即使你可能知道它在你的情況下是安全的,如果他們允許的話,它必須對所有情況都是安全的。

換句話說,編譯器不僅僅停止你,它正在阻止每個人,包括那些不知道它是不安全的,需要特殊處理的人.這可能還有其他原因,如果知道如何處理它們,所有語言通常都有辦法做不安全的事情.

在C#.NET中有類似的規定,宣告呼叫基礎建構函式的建構函式的唯一方法是:

 public ClassName(...) : base(...)
 

在這樣做的時候,基本建構函式將在建構函式的正文之前呼叫,您不能更改這個順序。

  相同標籤的其他問題

javaexceptionmockingtry-catch