Доступ к полю в Java на основе условия - PullRequest
1 голос
/ 31 октября 2019

Мне нужно написать вспомогательный метод, который может получить конкретное значение переменной от объекта при оценке некоторых условий.

Ниже приведены требования.

  1. if "name"приходит как вызов типа «getName» для получения значения.
  2. Если «подтип» приходит как вызов типа «getSubType» для получения значения подтипа.

ТекущийРешение:

       public Object getFieldValue(String type, IDTO dto){
        Method method = dto.getClass().getMethod("get"+createMethodName(type));
        Object returnedObject = method.invoke(dto, null);
        return returnedObject;
     }

Однако операции довольно тяжелые, и это вызывает проблемы с производительностью. Есть ли какая-либо альтернатива, которая может быть выбрана или любой другой лучший способ сделать это.

Другие пункты:

  1. Интерфейс IDTO имеет только все объявленные установщики геттера. В этом поле не объявлено.

1 Ответ

1 голос
/ 31 октября 2019

Если вам нужна производительность, я бы предложил использовать генерацию кода для служебного метода, обеспечивающего необходимый доступ к объектам IDTO. Обычно это будет встроено в сборку. Ваш сгенерированный метод может использовать хорошо выполняющуюся инструкцию switch для каждого «типа», например:

  /**
  * Utility for generic access to IDTO object properties. 
  * GENERATED code, do not change! See template ....
  */
  public Object getFieldValue(String type, IDTO dto){
    switch (type) {
      case "name" :  return dto.getName();
      case "subtype" :  return dto.getSubtype();
      ... 
    }
    // ERROR handling
    throw new RuntimeException("unknown property");
 }

Для реализации кода вашего генератора вы можете использовать отражение так же, как вы уже делали код выше. Для более широкого использования этого подхода я бы предложил ввести простой шаблонизатор, см., Например, https://freemarker.apache.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...