如何避免Java中的方法重载以避免重复?

use*_*267 2 java design-patterns coding-style

我有2个方法,它执行80%相同的工作,但结果处理不同.我在做 :

 private <T> T getResponse(final RestURI query, final Class<T> responseClass) throws IOException {
        T response = null;

        final RestResponse<Record> tempResponse = getResponseFromDataPath(query);

        if (isResponseOK(tempResponse, query)) {
            final CustomReader reader = createCustomReaderFromResponse(tempResponse);
            response = objectMapper.readValue(reader, responseClass);
                                                          ^
            // DIFFERENCE --------------------------------|
        }

        return response;
    }

    private <T> T getResponse(final RestURI query, final TypeReference valueTypeRef) throws IOException {
        T response = null;

        final RestResponse<Record> tempResponse = getResponseFromDataPath(query);

        if (isResponseOK(tempResponse, query)) {
            final CustomReader reader = createCustomReaderFromResponse(tempResponse);
            response = objectMapper.readValue(reader, valueTypeRef);
                                                          ^
            // DIFFERENCE --------------------------------|
        }

        return response;
    }
Run Code Online (Sandbox Code Playgroud)

这看起来很多重复.我如何做到这一点,以减少重复.

ern*_*t_k 5

您可以使用BiFunction调用的参数objectMapper:

private <T> T getResponse(final RestURI query, 
    final BiFunction<CustomReader, ObjectMapper, T> mapper) throws IOException {
    T response = null;

    final RestResponse<Record> tempResponse = getResponseFromDataPath(query);

    if (isResponseOK(tempResponse, query)) {
        final CustomReader reader = createCustomReaderFromResponse(tempResponse);
        response = mapper.apply(reader, objectMapper); 
    }

    return response;
}
Run Code Online (Sandbox Code Playgroud)

呼叫者可以选择如何呼叫objectMapper:

getResponse(query, 
   (reader, objectMapper) -> objectMapper.readValue(reader, <valueTypeRef>);
Run Code Online (Sandbox Code Playgroud)

要么:

getResponse(query, 
    (reader, objectMapper) -> objectMapper.readValue(reader, <class>);
Run Code Online (Sandbox Code Playgroud)

  • 要记住这一点很重要:当这种方法保持私密时,这只是一个好主意.它是**外部**代码正在使用的东西,然后显然不希望暴露这样的细节水平.不错的答案! (2认同)