2011-09-08 49 views
4

好了,這是不允許的:什麼解決方法將實例變量傳遞給超級構造函數?

public class ServiceError extends RuntimeException { 

    private final UUID uuid = UUID.randomUUID(); 

    public ServiceError(...) { 
     super("{" + uuid.toString() + "} " + ...); // error on reference to uuid 
    } 

可是我該怎麼做我想要什麼?沒有Exception.setMessage,所以在super構造函數完成後我無法更改消息,我需要在構造函數中傳遞UUID。

+0

覆蓋getMessage()? –

+0

重寫'getMessage()'是一個非常具體的解決方案。有更多的一般可能性嗎? –

回答

4

聽起來好像您可能想要在您的類中覆蓋getMessage()以返回對您的異常類有意義的消息。

作爲一個例子,這裏是ActivationException.getMessage()看起來像我的JDK:

public String getMessage() { 
    if (detail == null) 
     return super.getMessage(); 
    else 
     return super.getMessage() + 
      "; nested exception is: \n\t" + 
      detail.toString(); 
} 
7

我這樣做:

public class ServiceError extends RuntimeException { 

    private final UUID uuid; 

    public ServiceError() { 
     this(UUID.randomUUID()); 
    } 

    private ServiceError(UUID uuid) { 
     super("{" + uuid.toString() + "} " + ...); 
     this.uuid = uuid; 
    } 
} 

基本上這只是一個改變,其中UUID.randomUUID()呼叫的事並使用構造函數參數來構造superconstructor參數,並在之後將值保存到字段中。

+1

非常聰明... – edutesoy

+0

我正在用另一種方法,因爲我實際上有很多構造函數,不想重複所有的構造函數,但這是更可重用的方法(在重寫不會執行這個技巧的類中)。 –

+0

@Bart:你不需要全部重複它們:你只需要使用所有可能的參數(包括UUID)調用所有現有的構造函數。應該很簡單。我個人更喜歡這種方法來重寫 - 它不像你真的*試圖提供不同的邏輯。 –

相關問題