Константный метод с использованием Enums ИЛИ Refection?Необходимо вызвать методы на основе строки - PullRequest
2 голосов
/ 15 января 2012

У меня есть DTO (объекты передачи данных), отправленные в DAO (объект доступа к данным).

DTO имеет строку идентификатора.

Основываясь на этой строке (точнее, DTO), я хочу вызвать определенные методы в DAO.

Эти методы выполняют вызовы из базы данных.

Я нашел два варианта сделать это: 1. Постоянная конкретная реализация метода с использованием Enum 2. Вызвать метод, основанный на отражении (в этом случае DTO будет нести имя метода, который должен быть вызван.)

Я хочу знать, какой вариант лучше. Есть ли другие альтернативы? Можно ли делать вызовы из базы данных в Enum.

Используемый язык программирования - Java.

Ответы [ 2 ]

1 голос
/ 15 января 2012

Вы можете создать карту, которая сопоставляет строки с вызовами методов:

class YourDAO {

    private interface Action {
        public void perform();
    }

    private Map<String, Action> actions;

    public YourDAO() {
        actions.add("String1", new Action() {
            public void perform() {
                daoMethod1();
            }
        }
        actions.add("String2", new Action() {
            public void perform() {
                daoMethod2();
            }
        }
    }

    public void daoMethod1() {
        ...
    }

    public void daoMethod2() {
        ...
    }

    public void doSomethingWithDTO(YourDTO dto) {
        actions.get(dto.getIdentifier()).perform();
    }

}

Вы даже можете адаптировать эту идею для выполнения определенных действий с различными типами DTO, если вы измените тип ключа карты на Class<?> и вместо dto.getIdentifier() используйте dto.getClass().

1 голос
/ 15 января 2012

Я бы не помещал вызовы базы данных в ваш Enum.Вместо этого предоставьте метод в DAO, который принимает DTO, а затем позвольте этому методу вызывать другие методы в DAO на основе строки в DTO.Вы можете использовать оператор switch в Enum и сделать это очень эффективным.(В качестве альтернативы, поместите эту реализацию в отдельный класс «адаптера», так как можно утверждать, что этот код также строго не принадлежит DAO.)

Я бы также избегал рефлексии, главным образом из-за дополнительныхсложности - в том числе в отладке и устранении неполадок, а также потенциальные проблемы безопасности.(Что если строка содержит имя метода, который вы не хотите вызывать?)

...