Insensible à la casse d'une chaîne à une enum de Java

Java fournit un valueOf() méthode pour chaque Enum<T> objet, donc, étant donné un enum comme

public enum Day {
  Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

on peut faire une recherche comme

Day day = Day.valueOf("Monday");

Si la chaîne passée à valueOf() ne correspond pas (sensible à la casse) un Day valeur, une IllegalArgumentException est levée.

De faire une comparaison insensible à la casse, on peut écrire une méthode personnalisée à l'intérieur de la Day enum, par exemple

public static Day lookup(String day) {
  for (Day d : Day.values()) {
    if (d.name().equalsIgnoreCase(day)) {
      return type;
    }
  }
  return null;
}

Est-il de toute façon générique, sans utiliser la mise en cache de valeurs ou autres objets supplémentaires, à écrire une statique lookup() méthode comme ci-dessus qu'une seule fois (c'est à dire, pas pour tous les enum), étant donné que la values() méthode est implicitement ajoutée à la Enum<E> classe au moment de la compilation?

La signature d'un tel "générique" lookup() méthode serait semblable à la Enum.valueOf() méthode, c'est à dire:

public static <T extends Enum<T>> T lookup(Class<T> enumType, String name);

et qu'il mettrait en œuvre exactement la fonctionnalité de la Day.lookup() méthode pour n'importe quel enum, sans avoir besoin de ré-écrire la même méthode pour chaque enum.

  • Je suis sûr que vous le savez, mais la raison pourquoi le problème est apparu, c'est que vous ne respectez pas les enum de Java convention de nommage. Si vous avez été en utilisant la norme majuscules de nommage, vous utilisez simplement Day.valueOf(day.toUpperCase()) dans votre méthode de recherche
  • Non, la même exigence s'applique quel que soit le cas ou d'autres conventions de nommage. Une méthode commune pour toutes les fins de la demande. 🙂
  • L'ajout de @kiedysktos suggestion (ce qui, pour quelqu'un d'autre lecture, est de loin la solution la plus simple), je soupçonne OP cassé la convention d'affectation de noms parce qu'ils veulent le toString forme d'avoir uniquement la première lettre en majuscule comme c'est grammaticalement correct en anglais. Vous pouvez toujours accomplir ce en surchargeant la méthode toString: return super.toString().substring(0, 1).toUpperCase() + super.toString().substring(1);
InformationsquelleAutor PNS | 2015-02-04