код рефакторинга для генерации RuntimeException вместо возврата значения

Мне нужно реорганизовать существующий код из-за дублирования кода.

Следующая структура встречается более 10 раз в сумасшедшем классе:

public MyType doSomething(...) {
    MyType myType = ........
    if (myType == null) {
        final String message = "...";
        LOGGER.error(message);
        throw new XxxRuntimeException(message));
    }
    return myType;
}

Я хотел бы преобразовать строки LOGGER.error и throw new RuntimeException в новый метод, подобный этому:

private void logErrorAndThrowRuntimeException(String message) {
    LOGGER.error(message);
    throw new XxxRuntimeException(message));
}

Проблема в том, что внутри условия if после рефакторинга нет возвращаемого значения.

Я не могу изменить тип исключения с RuntimeException на Exception, потому что это приложение имеет сумасшедшую логику и нужно выбросить RuntimeExceptin.

Любая идея, как преобразовать эти две строки кода в новый метод и сохранить логику исходного метода нетронутой?


person zappee    schedule 30.05.2019    source источник


Ответы (1)


Объявите возвращаемый тип Throwable:

private XxxRuntimeException logErrorAndThrowRuntimeException(String message) {
    LOGGER.error(message);
    // You can throw here, or return if you'd prefer.
    throw new XxxRuntimeException(message));
}

Затем вы можете бросить это на сайт вызова, чтобы указать, что тело if не может нормально завершиться:

public MyType doSomething(...) {
    MyType myType = ........
    if (myType == null) {
        final String message = "...";
        throw logErrorAndThrowRuntimeException(message);
    }
    return myType;
}
person Andy Turner    schedule 30.05.2019