java перегрузка метода кажется неясной - PullRequest
1 голос
/ 19 января 2020

Я не уверен, является ли это правильным способом использования перегрузки метода или есть более хорошие / хорошие другие логики c. У меня есть те 4 случая, которые могут случиться. Есть ли ограничение на количество методов?

private ResponseEntity<ServiceResponse> handleResponse(ServiceResponse response, ServiceRequest request) {
    return handleResponse(response, request, null, null);
}

private ResponseEntity<ServiceResponse> handleResponse(ServiceResponse response, ServiceRequest request, Exception e) {
    return handleResponse(response, request, e, null);
}

private ResponseEntity<ServiceResponse> handleResponse(ServiceResponse response, ServiceRequest request, Header header) {
    return handleResponse(response, request, null, correlation);
}

private ResponseEntity<ServiceResponse> handleResponse(ServiceResponse response, ServiceRequest request, Exception e, Header header) {
 //logic//
}

Ответы [ 3 ]

2 голосов
/ 19 января 2020

Есть ли ограничение на количество методов

Нет практического предела; но вы удваиваете количество перегрузок каждый раз, когда добавляется другой «необязательный» параметр, поэтому увеличивается объем (как когнитивно, так и с точки зрения обслуживания) с точки зрения количества кода.

Для более чем 2 параметра, возможно, вы могли бы рассмотреть использование «шаблона компоновщика» (я говорю «компоновщик», потому что вы на самом деле не создаете что-то, просто вызываете метод).

handler()
    .withException(e) // omit if not needed
    .withHeader(h) // omit if not needed
    .call();
0 голосов
/ 19 января 2020

Нет ограничений на перегрузку методов. Однако нынешний дизайн хрупок. Что, если вы хотите учесть еще один параметр в будущем? Всякий раз, когда вы добавите дополнительный параметр, вы в конечном итоге измените все эти методы.

Лучше было бы создать класс, содержащий параметры, и использовать его. Например,

class ResponseContext {
    private ServiceResponse response;
    private ServiceRequest request;
    private Exception excp;
    private Header header;
}

Используйте builder pattern для создания вышеуказанного объекта, чтобы не создавать бесконечные конструкторы с различными комбинациями параметров.

Наконец, используйте только один метод

private ResponseEntity<ServiceResponse> handleResponse(ResponseContext responseContext) {
 //logic//
}

Благодаря вышеуказанному дизайну вы можете легко разместить дополнительные параметры, которые могут вам понадобиться в будущем. Теперь вам не нужно перегружать метод.

0 голосов
/ 19 января 2020

Вы совершенно правы. Нет ограничений на количество методов, если они имеют одинаковый тип возвращаемого значения и различаются по количеству или типу параметров. В конце концов, именно поэтому существует перегрузка метода.

...