Классы Java Refactor имеют один и тот же метод

Любые предложения для меня по рефакторингу класса, все статические методы одинаковы, отличается только одна переменная code.

public class SuccessResponseBuilder {

    static ResponseCode code = ResponseCode.OK;

    public static <T> @NotNull ResponseBean build() {
        return ResponseBean.builder(code, null);
    }

    public static <T> ResponseBean build(T data) {
        return ResponseBean.builder(code, data);
    }
}
public class ErrorResponseBuilder {

    static ResponseCode code = ResponseCode.ERROR;

    public static <T> @NotNull ResponseBean build() {
        return ResponseBean.builder(code, null);
    }

    public static <T> ResponseBean build(T data) {
        return ResponseBean.builder(code, data);
    }
}

Клиент будет использовать этот способ для получения результата

ErrorResponseBuilder.build(e.getMessage());SuccessResponseBuilder.build("ok");

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот гибкий, чистый подход. Основная идея — создать внутренний Builder класс. Преимущество в том, что вы можете просто добавить новый ResponseCode, не создавая новый класс.

public class ResponseBean {

    private final ResponseCode code;
    private Object data;

    private ResponseBean(ResponseCode code) {
        this.code = code;
    }

    private ResponseBean(ResponseCode code, Object data) {
        this.code = code;
        this.data = data;
    }

    public static Builder ok() {
        return new Builder(ResponseCode.OK);
    }

    public static Builder error() {
        return new Builder(ResponseCode.ERROR);
    }

    /* if you would like to create a new ResponseCode:
    public static Builder yourNewCode() {
        return new Builder(ResponseCode.NEW_CODE);
    }
    */

    public static class Builder {

        private final ResponseCode code;

        public Builder(ResponseCode code) {
            this.code = code;
        }
        
        public ResponseBean build() {
            return new ResponseBean(code);
        }

        public ResponseBean build(Object data) {
            return new ResponseBean(code, data);
        }
    }
}

Использование:

public void print() {
    ResponseBean okResponse = ResponseBean.ok().build("This is ok data");
    ResponseBean okResponseWithoutData = ResponseBean.ok().build();
    ResponseBean errorResponse = ResponseBean.error().build("This is error data");
    ResponseBean errorResponseWithoutData = ResponseBean.error().build();

    System.out.println(okResponse);
    System.out.println(okResponseWithoutData);
    System.out.println(errorResponse);
    System.out.println(errorResponseWithoutData);
}

Выход будет

ResponseBean(code=OK, data=This is ok data)
ResponseBean(code=OK, data=null)
ResponseBean(code=ERROR, data=This is error data)
ResponseBean(code=ERROR, data=null)

Спасибо за ваше предложение! С внутренним классом как Builder. Архитектура станет более понятной.

tony 09.05.2022 16:06

Другие вопросы по теме