2011-09-08 50 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)调用所有现有的构造函数。应该很简单。我个人更喜欢这种方法来重写 - 它不像你真的*试图提供不同的逻辑。 –

相关问题