Способность Enum реализовать часть бизнес-логики - PullRequest
1 голос
/ 06 февраля 2020

Попытка рефакторинга кода. Теперь код:

if ("objects".equals(type)) {
    Object oldJson = oldData.get("content");
    Object newJson = newData.get("content");
} else if ("objects.appeals".equals(type)) {
    Object oldJson = oldData.get("data").get("person");
    Object newJson = newData.get("data").get("person");
}

Количество типов намного больше. Я дал только 2 для примера. Пытаясь оптимизировать с помощью enum:

    public enum HistoryUpdateTypeEnum {
        OBJECTS("objects", new Document()),
        APPEALS_OBJECTS("appeals.objects", new Document());

        HistoryUpdateTypeEnum(String type, Document documentSlice) {
            this.type = type;
            this.documentSlice = documentSlice;
        }

        private String type;
        private Document documentSlice;

        public static HistoryUpdateTypeEnum fromString(String value) {
            return Stream.of(values())
                    .filter(Objects::nonNull)
                    .filter(v -> v.name().replaceAll("_",".").equalsIgnoreCase(value))
                    .findAny()
                    .orElse(null);
        }

        public Object formSlice(Document data) {
            this.documentSlice = data;
            return documentSlice.get("content"); // How to make it universal?
        }
    }

И использовать:

HistoryUpdateTypeEnum typeEnum = HistoryUpdateTypeEnum.fromString("objects.appeals");
Document oldData = new Document(......).append(..., ...);
Document newData = new Document(......).append(..., ...);
Object oldJson = typeEnum.formSlice(oldData);
Object newJson = typeEnum.formSlice(newData);

Я не могу понять, как заставить меня выполнять свои действия для каждого типа. То есть documentSlice.get («content») для «объектов» или documentSlice.get («data»). Get («person») для «appeals.objects». Есть какие-нибудь идеи?

1 Ответ

1 голос
/ 06 февраля 2020

Одним из возможных вариантов является абстрактный метод в вашем Enum классе:

public enum HistoryUpdateTypeEnum {

    OBJECTS {
        @Override
        Object getJson(Document data) {
            return data.get("objects");
        }
    },

    ...

    abstract Object getJson(Document data);
}

Тогда вы можете использовать его таким образом:

HistoryUpdateTypeEnum history = HistoryUpdateTypeEnum .valueOf(type.toUpperCase());
Object oldJson = history.getJson(oldData);
Object newJson = history.getJson(newData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...