Suchen Sie Java Enum nach einem anderen Element

Text

Ich habe versucht, Informationen zu "Suchen nach Java Enum durch ein anderes Element" zu sammeln und zu implementieren, über die manchmal gesprochen wird. Ich denke, es ist anständig, aber es gibt viele Probleme, die nicht gelöst werden können.

Prototyp mit 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);
  }
}

Das Schlüsselelement ist

  1. Geben Sie ein anderes Such- (Erfassungs-) Mittel als valueOf an
  2. Beliebige Addition ex enum zulassen Erlauben Sie Männern (0, "M"), Frauen (1, "F"), getByCode, getBySymbol usw. zu erhalten.
  3. Machen Sie es irgendwie identifizierbar, um es zu haben (Schnittstelle)

jedoch

  1. Es gibt keinen besonderen Vorteil beim Erben (statisch kann nicht vererbt werden)
  2. Ich kann keine Klasseninformationen in Generika haben (Klassengenerika können nicht statisch verwendet werden, aber es kann nicht als Radiergummi geholfen werden) In Bezug auf 3.2 kann T.values () nicht ausgeführt werden, wenn Sie es in die Generika der Methode einfügen. Daher benötigen Sie jedes Mal dasselbe Argument.
  3. Werden Sie optional (dies ist unvermeidlich, da es möglicherweise nicht verfügbar ist)
  4. (Obwohl dies nicht erforderlich ist, gibt es kein Element vom Basistyp (da es nicht ausgeglichen werden kann))

Es gibt viele Orte, an denen man sich Sorgen machen muss Um ehrlich zu sein, wäre es bequemer, eine Identifikations- und Such-API hinzuzufügen, indem der Lombok-Bibliothek Enum-Klassen-Accessoren und Mitglieder-Accessoren hinzugefügt werden.

Nachtrag

Es scheint gut zu sein, das, was Sie in den Kommentaren haben, in den Mittelpunkt der Verwendung zu stellen.

Basierend auf der Idee ein hilfreicher Link

Recommended Posts

Suchen Sie Java Enum nach einem anderen Element
[Java] enum (Aufzählungstyp)
[Java] Dynamischer Methodenaufruf durch Reflektion des Aufzählungstyps (Aufzählung)
Anwendungsbeispiel für Java Enum
Enum Reverse Map Java