Как получить имя файла enum во время выполнения на основе параметров бэкэнда? - PullRequest
1 голос
/ 23 мая 2019

У меня есть четыре файла enum в java, например: A.java, B.java, C.java. Теперь у меня есть требование, чтобы у меня был параметр, скажем, имя файла, если я получу параметр имени файла как A, то он выполнит файл A.java, то есть A.Red аналогично другим случаям. Имя файла придет из restAPI.

Я пытаюсь использовать интерфейс, т. Е. Я создал интерфейс и внедряю его для всех перечислений и пытаюсь перехватить ссылку на перечисление в интерфейсе, но проблема этого подхода заключается в том, что я не могу создать экземпляр перечисления. Вот что я попробовал:

String enumClassName = "enums.A";   
Class c = Class.forName(enumClassName);
//System.out.println(c.);
Object obj = c.newInstance();
SystemEnums enums = (SystemEnums)obj;
System.out.println(enums.getEnumType().get(0));

Здесь SystemEnums в интерфейсе.

A.java
enum A{
Red,Blue
}


B.java
enum B{
Yellow,Black
}


C.java
enum C{
Pink,White
}

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Как насчет какого-то реестра, который знает все доступные типы перечислений. В реестре может быть такой метод: getEnumByName (String enumName).

По моему мнению, здесь не нужен общий интерфейс, так как вы можете использовать стандартные перечисления.

См. Этот пример:

import java.util.Map;

public class Test {
  public static void main(String[] args) throws ReflectiveOperationException {
    EnumRegistry registry = new EnumRegistry();
    registry.registerEnum(A.class);
    registry.registerEnum(B.class);
    registry.registerEnum(C.class);

    final Enum enumByName = registry.getEnumByName("A");
  }
}

enum A {
  Red,
  Blue
}

enum B {
  Yellow,
  Black
}

enum C {
  Pink,
  White
}

public class EnumRegistry {

  private Map<String, Class<Enum>> registeredEnums = new HashMap<?>();

  public void registerEnum(Class e) {
    registeredEnums.put(e.getName(), e);
  }

  public Enum getEnumByName(String name) throws ReflectiveOperationException {
    final Class<Enum> enumClass = registeredEnums.get(name);
    if (enumClass != null) {
      return enumClass.newInstance();
    } else {
      return null;
    }
  }
}
0 голосов
/ 23 мая 2019

Если вы хотите получить экземпляры enum из отраженного класса enum, просто используйте values:

package x;

public class EnumTest {

    public enum TestEnum {
        A, B, C
    }

    public static void main(String[] args) throws Exception {
        Class<?> enumClass = Class.forName("x.EnumTest$TestEnum");
        Object[] enumInstances = (Object[]) enumClass.getMethod("values").invoke(null);
        for (Object enumInstance : enumInstances) {
            System.out.println(enumInstance);
        }
    }

}

Имейте в виду, что вызываемые значения каждый раз создают новый массив и могут быть дорогими.

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