Заставить Java Immutables генерировать toString() для классов Throwable

Можно ли заставить библиотеку обработки аннотаций Java Immutables генерировать метод toString для абстрактного класса, который уже наследует метод toString(), отличный от используемого по умолчанию?

Например:

@Value.Immutables
public abstract class MyRuntimeException extends RuntimeException {
    @Value.Default
    public abstract long timestamp();
    @Value.Redacted
    public abstract long secretTimestamp();
}

И результат будет:

MyRuntimeException e = ImmutableMyRuntimeException.builder().timestamp(111)
                                              .secretTimestamp(222).build();
assert e.toString().contains("111");
assert !e.toString().contains("222");

RuntimeException наследует toString() от Throwables, и то, что я видел до сих пор, библиотека Immutables пропускает генерацию toString() из-за этого.

1 ответ

Решение

Есть один такой способ. Хитрость заключается в объявлении абстрактного toString сигнатура метода в типе абстрактного значения.

@Value.Immutable
public abstract class MyRuntimeException extends RuntimeException {
    public abstract long timestamp();
    public abstract long secretTimestamp();
    @Override public abstract String toString(); //<-- forces toString impl
}
Другие вопросы по тегам