Как использовать enum со значениями в Java - PullRequest
7 голосов
/ 17 февраля 2012

Когда я пытаюсь использовать enum для хранения: "=", ">", "<" и т. Д., У меня есть: </p>

    public static enum DataValueModifier {
    EQUAL("="),
    GREATER_THAN(">"),
    GREATER_EUQAL(">="),
    LESS_THAN("<"),
    LESS_EQUAL("<="),
    APPRROXIMATE("~"),
    NOT_DETERMINED("ND");
    private String value;
    private DataValueModifier(String value) {
        this.value = value;
    }
    public String getValue() {
        return value;
    }
}

Как использовать его, когда я пытаюсь сравнить строкучтобы увидеть, содержит ли он знак "=", я должен сделать:

if (dataValue.contains(DataValueModifier.EQUAL.getValue())) {
...
}

Я понимаю, что использование enum - лучшая практика, но это выглядит глупо ... Спасибо,

David

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

Если вы определили метод boolean containedIn(String str) в вашем перечислении и импортировали интересующие вас значения перечисления (в данном случае EQUAL), использование будет выглядеть так:

if (EQUAL.containedIn(dataValue)) {
...
}
2 голосов
/ 18 февраля 2012

Прежде всего, я бы переместил метод «содержащий» (или его эквивалент) в само перечисление, определив метод isModifier.

public static enum DataValueModifier {

    ...

    public boolean isModifier( String modifierString ) 
    {
       return modifierString != null && value.equals(modifierString);
    }
}

Затем ваш код выглядит следующим образом:

if (DataValueModifier.EQUAL.isModifier(dataValue)) 
{
  //...
}

Но, что более важно, почему вы сначала используете dataValue вместо enum?Если вы получаете ввод из командной строки или что-то еще или анализируете строковое уравнение, а затем вам нужно выяснить выражение, я думаю, я понимаю.Но если у вас есть контроль над кодом, тогда вы должны просто начать с enum, и вы сможете сказать:

if ( dataValueEnum == DataValueModifier.EQUAL ) {
{
  //...
}

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

public static DataValueModifier toDataValueModifier( String dataValue ) {
    if( EQUAL.isModifier( dataValue ) {
       return EQUAL;
    } else if( GREATER_THAN.isModifier( dataValue ) {
       return GREATER_THAN;
    } else if...
       // Do this for all possible values
    } else {
       return UNKNOWN;
       // Also, add an UNKNOWN to your list of enum values.
    }
}

Методы isModifier и toDataValueModifier могут добавить немного уродливого кода к вашему перечислению DataValueModifier, но весь ваш другой код будет отлично выглядеть.Теперь вы можете сделать что-то вроде этого:

DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue);
if (dataValueEnum == DataValueModifier.EQUAL) {
   ...
}

или даже

switch( DataValueModifier.toDataValueModifier(dataValue) ) {
    case EQUAL:
        // ...
        break;
    case GREATER_THAN:
        // ...
        break;
    case GREATER_EQUAL:
        // ...
        break;
    // ... define all the cases you want
    case UNKNOWN:
    default:
         // ...
}
2 голосов
/ 17 февраля 2012

Мне нравится использовать статический импорт в этих случаях.

package mypackage;

public enum DataValueModifier
{
  //your enum code
}

затем ...

import static mypackage.DataValueModifier.*;

public MyClass
{

  // code blah blah blah

  public void doIt()
  {
    // more code blah blah
    if (dataValue.contains(EQUAL.getValue())) 
    {
      //...
    }
  }
}

Это немного лучше.

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