Выбор правильного Enum - PullRequest
       1

Выбор правильного Enum

2 голосов
/ 01 сентября 2011

У меня есть несколько перечислений, каждое из которых содержит имена проверяемых атрибутов.У меня проблема в том, как выбрать соответствующее перечисление для объекта.Как я могу определить только переменную Enum, которая используется во всем моем коде, которая может быть установлена ​​с помощью метода инициализации.

РЕДАКТИРОВАТЬ:

Извините за задержку ответа.Мне пришлось отойти от стола

Очень хорошо, будет плохой дизайн.У меня есть несколько перечислений следующим образом:

public enum AccountGrpEnum {
    Account("Account"),
    AccountType("AccountType"),
    AcctIDSource("AcctIDSource");

    private static Set<String> grpNames = new HashSet<String>(3) {{       
        for(AccountGrpEnum e : AccountGrpEnum.values()) {          
            add(e.toString());       
        }     
    }}; 

    public static boolean contains(String name) {       
        return grpNames.contains(name);     
    } 

    private String name;

    private AccountGrpEnum(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }

}

Другой Enum:

public enum BlockManValEnum {

    avgPx("avgPx"),
    quantity("quantity"),
    securityIDSource("securityIDSource"),
    securityID("securityID"),
    blockStatus("blockStatus"),
    side("side");

    private static Set<String> names = new HashSet<String>(9) {{       
        for(BlockManValEnum e : BlockManValEnum.values()) {          
            add(e.toString());       
        }     
    }}; 

    public static boolean contains(String name) {       
        return names.contains(name);     
    } 

    private String name;

    private BlockManValEnum(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }

}

В моем коде я проверяю поля входящего объекта, чтобы увидеть, содержатся ли они вEnum.Следующее:

if (BlockManValEnum.contains(fields[i].getName()))

однако я бы хотел, чтобы оно было в соответствии с

if (variableEnum.contains(fields[i].getName()))

Где variableEnum можно установить во время выполнения.

Надеюсьпонятнее ребята

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Опираясь на предыдущие ответы.

enum Color {
    RED(1),
    GREEN(2),
    BLUE(3);

    int attrib;

    Color(int attribValue) {
        attrib = attribValue;
    }

    public Color getColorForAttrib(int attribValue) {
        for(Color c : Color.values()) {
            if(c.attrib == attribValue) {
                return c;
            }
        }
        throw new IllegalArgumentException("No color could be found for attrib of value " + attribValue);
    }
}

...


class SomeClass {
    Color c;
    public void SomeClass(Color c) {
        this.c = c;
    }
 }

...

class SomeClassUser {
    public static void main(String[] args) {
        Color c = Color.getColorForAttrib(Integer.valueOf(args[i]));
        new SomeClass(c);
    }
}

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

1 голос
/ 01 сентября 2011

Использование Enum.valueOf:

Enum<?> variableEnum = AccountGrpEnum.class;
if(Enum.valueOf(variableEnum.getClass(), field[i].getName()) != null) {
   doSomething();
}
0 голосов
/ 01 сентября 2011

Поскольку перечисления являются классами и, таким образом, может реализовывать интерфейсы, вы можете создать интерфейс, содержащий ваш метод contains (), а затем реализовать этот метод в ваших перечислениях, а затем использовать универсальныйметод, который принимает токен класса определенного типа перечисления, реализующий этот интерфейс (и который может быть установлен во время выполнения) для тестирования.Примерно так:

CanBeTestedForContains:

public interface CanBeTestedForContains {
  boolean contains(String name);
}

ColorEnum:

import java.util.HashSet;
import java.util.Set;

public enum ColorEnum implements CanBeTestedForContains {
  R("red"),
  B("blue");

  private static Set<String> names = new HashSet<String>(3) {
    {
      for (final ColorEnum e : ColorEnum.values()) {
        add(e.name);
      }
    }
  };

  private String name;

  private ColorEnum(final String name) {
    this.name = name;
  }

  @Override
  public boolean contains(final String name) {
    return names.contains(name);
  }
}

SuitEnum:

import java.util.HashSet;
import java.util.Set;

public enum SuitEnum implements CanBeTestedForContains {
  D("diamonds"),
  H("hearts"),
  C("clubs"),
  S("spades");

  private static Set<String> names = new HashSet<String>(3) {
    {
      for (final SuitEnum e : SuitEnum.values()) {
        add(e.name);
      }
    }
  };

  private String name;

  private SuitEnum(final String name) {
    this.name = name;
  }

  @Override
  public boolean contains(final String name) {
    return names.contains(name);
      }
}

ContainsSelectorTest:

public class ContainsSelectorTest {
  private static <E extends Enum<E> & CanBeTestedForContains> boolean contains(final Class<E> enumClass, final String name) {
    return enumClass.getEnumConstants()[0].contains(name);
  }

  public static void main(final String[] args) {
    if (contains(ColorEnum.class, "red")) {
      System.out.printf("%s contains %s\n", ColorEnum.class, "red");
    }

    if (contains(SuitEnum.class, "hearts")) {
      System.out.printf("%s contains %s\n", SuitEnum.class, "hearts");
    }

    if (contains(SuitEnum.class, "red")) {
      System.out.println("This shouldn't happen.");
    } else {
      System.out.printf("%s DOES NOT contain %s\n", SuitEnum.class, "red");
    }
  }
}

Выход:

Класс ColorEnum содержит красный

класс SuitEnum содержит сердца класс

класс SuitEnum НЕ содержит красный

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