2 похожих java перечисления и метод, который решает, из какого перечисления выбрать значение - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу реализовать метод, который решает, из какого java-перечисления получить конкретное значение.Например:

public enum Credentials1 {
    USERNAME("user"),
    PASSWORD("pass");
}
public enum Credentials2 {
    USERNAME("user"),
    PASSWORD("pass");
}

, а затем в другом классе я хочу, чтобы универсальный метод на основе другого параметра решил, какое перечисление следует использовать, чтобы получить правильного пользователя.Что-то вроде:

public String decide(here I should pass something?) {
    switch (myParam) {
        case "1":
            return Credentials1.USERNAME;
        case "2":
            return Credentials2.USERNAME;
    }
    return "";
}

Может ли это быть достижимо, потому что я не преуспел?И подумайте, что кроме USERNAME и PASSWORD у меня будет много констант в этих перечислениях.

Ответы [ 2 ]

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

Сначала создайте метод, который возвращает желаемый класс перечисления:

public Class<? extends Enum<?>> getEnum(int param)
{
  // Determine enumeration class based on specified parameter
  switch (param)
  {
    case 1:
      return (Enum1.class);
    case 2:
      return (Enum2.class);
    default:
      return (null);
  }

} // getEnum

Затем создайте метод, который возвращает желаемый экземпляр:

public Object getEnumInstance(Class<? extends Enum<?>> clazz,
                              String                   name)
  throws Exception
{
  // Determine the 'valueOf()' method that creates an instance from a string
  // Every enumeration class has a static valueOf() method that expects a String as a parameter
  Method value_of_method;
  value_of_method = clazz.getDeclaredMethod("valueOf", String.class);

  // Get and return instance
  return (value_of_method.invoke(null, name));

} // getEnumInstance

Затем создайте метод, который возвращаетзначение указанного перечисления:

public String getEnumValue(Object enum_instance)
  throws Exception
{
  // Determine the 'getValue()' method of this enumeration instance
  // At least, I suppose the method is called like that in your enumeration classes
  // It doesn't want parameters and returns a String
  Method get_value_method;
  get_value_method = enum_instance.getClass().getMethod("getValue");

  // Return value of the enumeration instance
  return ((String)get_value_method.invoke(enum_instance));

} // getEnumValue

Наконец, создайте метод, который объединяет весь материал:

public String decide(int    param,
                     String enum_instance_name)
  throws Exception
{
  // Get correct enumeration class
  Class<? extends Enum<?>> enum_class;
  enum_class = getEnum(param);

  // Get correct instance
  Object enum_instance;
  enum_instance = getEnumInstance(enum_class, enum_instance_name);

  // Return its value
  return (getEnumValue(enum_instance));

} // decide

Теперь мы наконец можем сделать то, что должны сделать:

public void run()
  throws Exception
{
  // Get password of 2nd enum
  String result;
  result = decide(2, "PASSWORD");
  System.out.println(result);

  // Or username of 1st enum
  result = decide(1, "USERNAME");
  System.out.println(result);

} // run
0 голосов
/ 18 сентября 2018

Создайте интерфейс Credentials с помощью следующего метода:

public interace Credentials {

    public String value();
}

Сделайте эти enum s для реализации интерфейса с общим методом, возвращающим значение.Ниже Credentials1.Credentials2 реализован аналогично.

public enum Credentials1 implements Credentials {

    USERNAME("user"),
    PASSWORD("pass");

    private String value;

    Credentials1(String value) {
        this.value= value;
    }

    @Override
    public String value() {
        return this.str;
    }
}

Здесь вы передаете правильный enum для дальнейшей обработки:

public String decide(Credentials credentials) {
     return credentials.value();
}

Пример использования:

String string = this.decide(Credentials1.USERNAME);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...