Какой обходной путь для передачи переменной экземпляра в супер конструктор? - PullRequest
4 голосов
/ 08 сентября 2011

Хорошо, так что это не разрешено:

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 ]

7 голосов
/ 08 сентября 2011

Я бы сделал это:

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() и использования параметра конструктора как для создания аргумента суперконструктора, так и для сохранения значения.в поле потом.

4 голосов
/ 08 сентября 2011

Похоже, вы можете переопределить getMessage() в своем классе, чтобы вернуть сообщение, которое имеет смысл для вашего класса исключений.

В качестве примера, вот как ActivationException.getMessage() выглядит в моем JDK:

public String getMessage() {
    if (detail == null) 
        return super.getMessage();
    else
        return super.getMessage() + 
            "; nested exception is: \n\t" +
            detail.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...