Java: используйте enum для вызова методов набора в классе - PullRequest
0 голосов
/ 07 сентября 2018

Мой класс в настоящее время выглядит так:

@Getter
@Setter
public class Class1 {

    private String v1;
    private String v2;
    private String v3;
    ...

    //Enum to be used to index each variable
    public enum EnumFields
   {
      ENUM_V1,
      ENUM_V2,
      ENUM_V3,
      ...
      ...
   }

   public Class1(String[] arrayStr) {
      setV1(arrayStr[EnumFields.ENUM_V1.ordinal()]);
      setV2(arrayStr[EnumFields.ENUM_V2.ordinal()]);
      setV3(arrayStr[EnumFields.ENUM_V3.ordinal()]);
       ...
  }

}

Как я могу упростить конструктор? Есть ли способ, которым я могу сопоставить функции набора для каждого из значений перечисления и вызвать их в цикле for? Если да, то как?

Спасибо, Swagatika

1 Ответ

0 голосов
/ 07 сентября 2018

Использование Reflection может упростить конструкцию. Предположим, вы хотите вызвать метод setVn в соответствии с перечислением EnumFields, метод может быть получен из класса Reflection и может быть вызван.

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Class1 {
    // Enum to be used to index each variable
    public enum EnumFields {
        ENUM_V1, ENUM_V2, ENUM_V3,

    }

    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        String[] arrayStr = new String[EnumFields.values().length];
        for (int i = 0; i < arrayStr.length; i++) {
            arrayStr[i] = String.valueOf(i);
        }
        Class1 class1 = new Class1(arrayStr);
        System.out.println(class1.v1);
        System.out.println(class1.v2);
        System.out.println(class1.v3);
    }

    private String v1;
    private String v2;
    private String v3;

    public Class1(String[] arrayStr) throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        for (EnumFields enumField : EnumFields.values()) {
            Method setMethod = Class1.class.getDeclaredMethod("setV" + (enumField.ordinal() + 1), String.class);
            setMethod.invoke(this, arrayStr[enumField.ordinal()]);
        }
    }

    private void setV1(String v) {
        this.v1 = v;
    }

    private void setV2(String v) {
        this.v2 = v;
    }

    private void setV3(String v) {
        this.v3 = v;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...