Обратный постоянный поиск - PullRequest
0 голосов
/ 28 марта 2012

У меня есть класс со списком констант ...

  public static final java.lang.String HEARTBEAT = "0";
  public static final java.lang.String TEST_REQUEST = "1";
  public static final java.lang.String RESEND_REQUEST = "2";

Я бы хотел как-нибудь перейти от "0" -> "HEARBEAT".

Любые хорошие классы утилитза это?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Если это возможно (например, вам разрешено изменять код), измените эти константы на enum. Таким образом, вы можете легко закодировать функцию «обратного просмотра», связав значение с каждой записью перечисления.

Теоретически, если у вас есть каждая запись, представляющая число от 0..N, вы можете даже использовать номер записи (он указан в перечислении), но это не совсем лучший метод.

Так как вы не можете использовать enum, вы можете взломать его с помощью отражения (предупреждение, это неправильно).

Доступ к статическому конечному значению ivar в Java с помощью отражения

Этот поток имеет некоторый код, который обращается к значениям public static final с отражением. Вы можете использовать карту для хранения этих отношений, искать их в реальном времени или пытаться инкапсулировать их в Enum, как предложил Джон Скит, и использовать это перечисление с тех пор (со всеми вытекающими преимуществами).

1 голос
/ 28 марта 2012

Я бы предложил использовать перечисление вместо констант для начала - тогда вы можете создать обратное отображение внутри перечисления.

public enum RequestType {
    HEARTBEAT("0"),
    TEST_REQUEST("1"),
    RESEND_REQUEST("2");

    private final String text;
    private static final Map<String, RequestType> reverseLookup;

    static {
        // Or use an immutable map from Guava, etc.
        reverseLookup = new HashMap<String, RequestType>();
        for (RequestType type : EnumSet.allOf(RequestType.class)) {
            reverseLookup.put(type.text, type);
        }
    }

    private RequestType(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public static RequestType getType(String text) {
        return reverseLookup.get(text);
    }
}
...