将实例变量传递给超级构造函数的解决方法是什么?

时间:2011-09-08 15:34:35

标签: java constructor

好的,所以不允许这样做:

public class ServiceError extends RuntimeException {

    private final UUID uuid = UUID.randomUUID();

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

但我怎么能做我想要的呢?没有Exception.setMessage,所以在超级构造函数完成后我无法更改消息,我需要在构造函数中传递UUID。

2 个答案:

答案 0 :(得分: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()调用的位置,并使用构造函数参数来构造超构造参数并在之后将值保存到字段中。

答案 1 :(得分:4)

听起来您可能希望覆盖类中的getMessage()以返回对您的异常类有意义的消息。

作为一个例子,这里是我的JDK中ActivationException.getMessage()的样子:

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