Как перегруппировать catch окончательно в один метод в Java 8? - PullRequest
0 голосов
/ 04 января 2019

Впервые на Java 8, я хотел бы оптимизировать мой код ниже:

public Response create() {
    try{
        ...
    } catch (Exception e) {
        codeA;
    } finally {
        codeB;
    }
}

public Response update() {
    try{
        ...
    } catch (Exception e) {
        codeA;
    } finally {
        codeB;
    }
}

У меня есть много методов, использующих один и тот же способ для перехвата исключений и, наконец, делаю то же самое, возможно ли заменить приведенный ниже общий код методом в java 8? Чтобы я мог оптимизировать все свои методы, которые используют этот общий код.

} catch (Exception e) {
    codeA;
} finally {
    codeB;
}

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Вы можете обернуть свой payload и поместить его в отдельный метод. Одна вещь; что вы ожидаете вернуть на исключение поймать. На этот раз это null, но, возможно, вы могли бы указать значение по умолчанию.

public static <T> T execute(Supplier<T> payload) {
    try {
        return payload.get();
    } catch(Exception e) {
        // code A
        return null;
    } finally {
        // code B
    }
}

Код клиента может выглядеть так:

public Response create() {
    return execute(() -> new CreateResponse());
}

public Response update() {
    return execute(() -> new UpdateResponse());
}
0 голосов
/ 04 января 2019

Это может быть общее решение.

//here describe supplier which can throw exceptions

@FunctionalInterface
public interface ThrowingSupplier<T> {
    T get() throws Exception;
}

// The wrapper
private <T> T callMethod(ThrowingSupplier<T> supplier) {
    try {
        return supplier.get();
    } catch (Exception e) {
        //code A
    }finally {
        // code B
    }
}
0 голосов
/ 04 января 2019

Зависит от того, что вы делаете в .... Вы могли бы сделать что-то вроде этого:

private Response method(Supplier<Response> supplier) {
    try{
        return supplier.get();
    } catch (Exception e) {
        codeA;
    } finally {
        codeB;
    }
}

и вызывать как:

public Response create() { return method(() -> { ... for create }); }
public Response update() { return method(() -> { ... for update }); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...