Search code examples
javadesign-patternscoding-style

How to avoid Method Overloading in Java to avoid duplicates?


I have 2 method which performs 80% same work but differ in result processing. I am doing :

 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;
    }

This looks like lot of duplicate. How do I make this such that I reduce the duplicates.


Solution

  • You can use a BiFunction parameter that calls 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;
    }
    

    And callers can choose how to call objectMapper:

    getResponse(query, 
       (reader, objectMapper) -> objectMapper.readValue(reader, <valueTypeRef>);
    

    Or:

    getResponse(query, 
        (reader, objectMapper) -> objectMapper.readValue(reader, <class>);