Envisagez de rechercher Java Enum par un autre élément

Texte

J'ai essayé de collecter et d'implémenter des informations sur "Recherche de Java Enum par un autre élément", dont on parle parfois. Je pense que c'est décent, mais il y a de nombreux problèmes qui ne peuvent pas être résolus.

Prototype avec ideone

test.java


/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.function.*;

interface Searchable {
  public static <T extends Enum,N extends Comparable> Optional<T> getByCode(Supplier<T[]> v,Function<T,N> s,N code) 
  {
    return Arrays.stream(v.get())
                 .filter(data -> s.apply(data).equals(code))
                 .findFirst();
  }
}

enum TestEnum implements Searchable { 
  A(1),B(2),C(3);
  private final Integer id;
  private TestEnum (int id) { this.id = id;}

  public Integer getId() { return id; }
    
  public static Optional<TestEnum> getById(Integer id){
    return Searchable.getByCode(TestEnum::values,TestEnum::getId,id);
  }
}

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
  public static void main (String[] args) throws java.lang.Exception
  {
    TestEnum.getById(2).ifPresent(System.out::println);
  }
}

L'élément clé est

  1. Fournir un moyen de recherche (acquisition) autre que valueOf
  2. Autoriser les ajouts arbitraires ex enum Autoriser male (0, "M"), female (1, "F") à getByCode, getBySymbol, etc.
  3. Rendre identifiable d'une manière ou d'une autre pour l'avoir

pourtant

  1. L'héritage n'a pas de mérite particulier (la statique ne peut pas être héritée)
  2. Je ne peux pas avoir d'informations de classe dans les génériques (les génériques de classe ne peuvent pas être utilisés de manière statique, mais ils ne peuvent pas être aidés comme une gomme) Concernant 3.2, T.values () ne peut pas être fait lorsque vous l'amenez dans les génériques de la méthode, vous avez donc besoin du même argument à chaque fois
  3. Devenez facultatif (cela est inévitable car il peut ne pas être disponible)
  4. (Bien que ce ne soit pas nécessaire, il n'y a pas de membre de type de base (car il ne peut pas être égalisé))

Il y a de nombreux endroits à craindre Pour être honnête, il serait plus pratique d'ajouter une API d'identification et de recherche en ajoutant des accesseurs de classe enum et des accesseurs membres à la bibliothèque Lombok.

Postscript

Il semble bon de mettre ce que vous avez dans les commentaires au cœur de l'utilisation.

Basé sur l'idée, un lien utile

Recommended Posts

Envisagez de rechercher Java Enum par un autre élément
[Java] enum (type d'énumération)
[Java] Appel de méthode dynamique par réflexion du type enum (enum)
Exemple d'utilisation de Java Enum
Enum Reverse Map Java