Лучшая практика для поиска Перечисления Java

Один из возможных способов:

array.reduce((acc, ele) => {
    const temp = ele.match(/<span.*?>(.*)<\/span>/)[1];
    return temp ? acc.concat(temp) : acc;
}, [])

Я использую reduce, потому что я не уверен, есть ли у всех элементов тег <span>. Если так, то map также работает.

43
задан Marcus Leon 2 June 2016 в 15:44
поделиться

7 ответов

Возможно, вы можете реализовать общий статический метод lookup .

Примерно так

public class LookupUtil {
   public static <E extends Enum<E>> E lookup(Class<E> e, String id) {   
      try {          
         E result = Enum.valueOf(e, id);
      } catch (IllegalArgumentException e) {
         // log error or something here

         throw new RuntimeException(
           "Invalid value for enum " + e.getSimpleName() + ": " + id);
      }

      return result;
   }
}

Затем вы можете

public enum MyEnum {
   static public MyEnum lookup(String id) {
       return LookupUtil.lookup(MyEnum.class, id);
   }
}

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

34
ответ дан 26 November 2019 в 23:01
поделиться

Можно использовать статическую карту поиска, чтобы избежать исключения и возвратить пустой указатель, затем бросить, как Вы хотели бы:

public enum Mammal {
    COW,
    MOUSE,
    OPOSSUM;

    private static Map<String, Mammal> lookup = 
            Arrays.stream(values())
                  .collect(Collectors.toMap(Enum::name, Function.identity()));

    public static Mammal getByName(String name) {
        return lookup.get(name);
    }
}
0
ответ дан 26 November 2019 в 23:01
поделиться

Apache Commons Lang 3 contais класс EnumUtils. Если Вы не используете Apache палата общин в Ваших проектах, Вы делаете его неправильно. Вы изобретаете велосипед!

существует дюжина прохладных методов, без которых мы могли использовать, выдает Исключение. Например:

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

Этот метод отличается от Enum.valueOf, в котором он не бросает exceptionfor недопустимое перечислимое имя и выполняет нечувствительное к регистру соответствие имени.

EnumUtils.getEnumIgnoreCase(SeasonEnum.class, season);
0
ответ дан 26 November 2019 в 23:01
поделиться

Почему мы должны писать этот 5-строчный код?

public class EnumTest {
public enum MyEnum {
    A, B, C, D;
}

@Test
public void test() throws Exception {
    MyEnum.valueOf("A"); //gives you A
    //this throws ILlegalargument without having to do any lookup
    MyEnum.valueOf("RADD"); 
}
}
3
ответ дан 26 November 2019 в 23:01
поделиться

Если вы хотите, чтобы поиск был нечувствительным к регистру, вы можете перебирать значения в цикле, делая его более удобным:

 public enum MyEnum {
   A, B, C, D;

      public static MyEnum lookup(String id) {
        boolean found = false;
        for(MyEnum enum: values()){
           if(enum.toString().equalsIgnoreCase(id)) found = true;
        }  
        if(!found) throw new RuntimeException("Invalid value for my enum: " +id);
       }
}
3
ответ дан 26 November 2019 в 23:01
поделиться

Сообщение об ошибке в IllegalArgumentException уже достаточно информативно.

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

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

2
ответ дан 26 November 2019 в 23:01
поделиться

Похоже, у вас здесь плохая практика, но не там, где вы думаете.

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

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

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

Что-то вроде:

// This code uses pure fantasy, you are warned!
class MyApi
{
    // Return the 24-hour from a 12-hour and AM/PM

    void getHour24(Request request, Response response)
    {
        // validate user input
        int nTime12 = 1;
        try
        {
            nTime12 = Integer.parseInt(request.getParam("hour12"));
            if( nTime12 <= 0 || nTime12 > 12 )
            {
                throw new NumberFormatException();
            }
        }
        catch( NumberFormatException e )
        {
            response.setCode(400); // Bad request
            response.setContent("time12 must be an integer between 1 and 12");
            return;
        }

        AMPM pm = null;
        try
        {
            pm = AMPM.lookup(request.getParam("pm"));
        }
        catch( IllegalArgumentException e )
        {
            response.setCode(400); // Bad request
            response.setContent("pm must be one of " + AMPM.values());
            return;
        }

        response.setCode(200);
        switch( pm )
        {
            case AM:
                response.setContent(nTime12);
                break;
            case PM:
                response.setContent(nTime12 + 12);
                break;
        }
        return;
    }
}
13
ответ дан 26 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: