[JAVA] [Kotlin] Ein Beispiel für die Verarbeitung mit Enum

zunaechst

Ich habe Enum häufig beim Schreiben von Code verwendet, daher fasse ich einige Beispiele für das zusammen, was ich tatsächlich verwendet habe.

Der Code ist in Kotlin geschrieben. Obwohl die Beschreibungsmethode unterschiedlich ist, denke ich, dass sie mit demselben Mechanismus in Java implementiert werden kann. (Vielleicht kann es in anderen Sprachen gemacht werden)

Codewert ⇔ Namenskonvertierungsprozess

Wenn die Daten eine Spezifikation wie "Mit dem Codewert (01 usw.) behandeln, aber beim Anzeigen auf dem Bildschirm mit dem Namen anzeigen möchten" enthalten, müssen Sie den Codewert in den Namen und den Namen in den Codewert konvertieren.

Im Folgenden werden wir den Fall der Verwendung einer einfachen bedingten Verzweigung und die Implementierungsmethode unter Verwendung von Enum auflisten.

Verwendung der bedingten Verzweigung

Hier sind einige Codes, die mir einfallen:

    //Code in Namen konvertieren
    fun convert(code : String) : String {

        if ("01" == code) {
            return "Name 1"
        } else if ("02" == code) {
            return "Name 2"
        }

        //Danach werden bedingte Verzweigungen für die Anzahl der Codewerte hinzugefügt.

        //Wenn nicht zutreffend, senden Sie es wie es ist zurück.
        //Hier gibt es Spezifikationen.
        return code
    }

Der bedingte Zweig kann eine switch-Anweisung oder eine when-Anweisung sein. Da es sich bei dem oben genannten um den Codewertkonvertierungsprozess handelt, muss auch der Codewertkonvertierungsprozess erstellt werden.

So verwenden Sie Enum

Es kann mithilfe der bedingten Verzweigung implementiert werden, es müssen jedoch jedes Mal zwei Prozesse geändert werden, wenn ein Codewert geändert oder hinzugefügt wird. Es ist einfach nervig.

Die Methode, die Enum verwendet, nutzt die Tatsache, dass Enum eine Klasse ist, die Variablen und Methoden definieren sowie Konstanten aufzählen kann, und implementiert, um nicht so viele bedingte Verzweigungen wie die Anzahl der Codes zu schreiben.

Durch diese Implementierung können zusätzliche bedingte Zweige gelöscht werden, und selbst wenn Änderungen oder Ergänzungen vorgenommen werden, kann nur die Definition von Enum geändert werden.


enum class Test(val code : String, val value : String) {

    //Wenn sich der Codewert ändert, beheben Sie ihn hier
    KUBUN1("01", "Name 1"),
    KUBUN2("02", "Name 2"),
    KUBUN3("03", "Name 3");

    //Definition der statischen Methode in Java
    companion object {
        fun toValue(code : String) : String {
            //Wenn es eine gibt, die der Enum-Aufzählung entspricht, geben Sie sie zurück
            for (item in enumValues<Test>()) {
                if (item.code == code) {
                    return item.value
                }
            }
            
            //Wenn kein zutreffendes Element vorhanden ist, geben Sie die Eingabe unverändert zurück
            return code
        }

        fun toCode(value : String) : String {
            //Wenn es eine gibt, die der Enum-Aufzählung entspricht, geben Sie sie zurück
            for (item in enumValues<Test>()) {
                if (item.value == value) {
                    return item.code
                }
            }

            //Wenn kein zutreffendes Element vorhanden ist, geben Sie die Eingabe unverändert zurück
            return value
        }
    }
}

Sie können den Konvertierungsprozess wie Test.toValue (beliebiger Wert) verwenden.

Selbst im obigen Beispiel wird die Klassendefinition geändert, wenn eine Änderung vorgenommen wird. Der Unterschied zum Beispiel mit bedingter Verzweigung besteht jedoch darin, dass ** Verarbeitung ** und ** Daten ** getrennt sind. Es ist in. Im Beispiel der bedingten Verzweigung sind die Daten und der Prozess integriert. Wenn Sie also die Daten ändern, müssen Sie auch den Prozess ändern. Im Enum-Beispiel müssen Sie jedoch nur die Daten ändern und Sie müssen den Prozess nicht ändern. ..

Weitere Daten trennen

Wenn Sie ohnehin keine Daten in der Klasse haben möchten, können Sie die Definition in eine externe Datei schreiben und lesen, um Enum zu erstellen. (Versuchen Sie es mit Json)

Oder registrieren Sie es in der Datenbank. Erstens, wenn die Spezifikation Codewerte bei der Verarbeitung verarbeiten soll, scheint es, dass die Daten häufig der Wert sind, der in der Datenbank registriert werden soll, so dass dies realistischer ist.

Diese beeinträchtigen die Leistung aufgrund der Zunahme der Anzahl der Datei-E / A und des Datenbankzugriffs. Daher ist es möglicherweise besser, Maßnahmen wie eine einzelne Tonne zu ergreifen. Gleichzeitig threadsicher.

Serpentin

Wenn Sie die Enum-Klasse nur für Daten schreiben und die Verarbeitung separat schreiben möchten, können Sie sie über die Schnittstelle implementieren.


interface ITest {
    fun code() : String
    fun value() : String
}


enum class Test(val code : String, val value : String) : ITest {

    KUBUN1("01", "Name 1"),
    KUBUN2("02", "Name 2"),
    KUBUN3("03", "Name 3");

    override fun code(): String {
        return code
    }

    override fun value(): String {
        return value
    }

    companion object {
        //Java ist in Ordnung, wenn der Array-Typ als Schnittstelle verwendet wird
        //Kotlin ist eine Klasse, daher ist es ein wenig anstrengend
        val VALUE : Array<ITest> = Arrays.copyOf(values(), values().size)
    }
}


class Hoge {
    companion object {
        fun toValue(items : Array<ITest>, code: String): String {
            //Wenn es eine gibt, die der Enum-Aufzählung entspricht, geben Sie sie zurück
            for (item in items) {
                if (item.code() == code) {
                    return item.value()
                }
            }

            //Wenn kein zutreffendes Element vorhanden ist, geben Sie die Eingabe unverändert zurück
            return code
        }

        fun toCode(items : Array<ITest>, value: String): String {
            //Wenn es eine gibt, die der Enum-Aufzählung entspricht, geben Sie sie zurück
            for (item in items) {
                if (item.value() == value) {
                    return item.code()
                }
            }

            //Wenn kein zutreffendes Element vorhanden ist, geben Sie die Eingabe unverändert zurück
            return value
        }
    }
}

fun main(args: Array<String>) {
    //Name 2 kommt heraus
    println(Hoge.toValue(Test.VALUE, "02"))
}

Der ursprüngliche Konvertierungsprozess empfängt die Eingabe an der Schnittstelle, und der darin enthaltene Prozess ruft den Implementierungsprozess der Schnittstelle auf.

Der Grund für die Verwendung der Schnittstelle besteht darin, dass Sie den Konvertierungsprozess mit einer Methode mithilfe der Schnittstelle realisieren können, wenn Sie verschiedene Aufzählungen definieren, aber denselben Zweck haben. Nicht erforderlich, wenn Sie nur eine Aufzählung erstellen möchten.

Beurteilungsverarbeitung durch Kombinieren beliebiger Elemente

Es gibt Elemente, die als Verarbeitungsstatus und -status bezeichnet werden. Wenn Sie einen Prozess realisieren möchten, der einen Booleschen Wert zurückgibt, indem Sie die oben genannten Elemente kombinieren, müssen Sie jedes Element überprüfen und das Ergebnis zurückgeben.

Die Kombinationen, wenn die Spalte der Verarbeitungsstatus und die Zeile der Status ist, werden unten gezeigt. Stellen Sie sich vor, Sie geben true für ○ und false für × zurück.

01 02 03
1 × ×
2 × × ×
3 ×

Im Folgenden werden die Verarbeitung mit bedingter Verzweigung und die Implementierungsmethode mit Enum aufgelistet.

Verwendung der bedingten Verzweigung

Es gibt die folgenden Methoden. In diesem Prozess werden nur wahre Bedingungen extrahiert, und die anderen werden als falsch festgelegt und als Bedingungen ausgelöst. Sie können alle bedingten Zweige beschreiben.


    //Überprüfen Sie das Eingabe- und Rückgabeergebnis
    fun validate(status : String, processStatus: String) : Boolean {

        if (status == "1" && processStatus == "01") {
            return true
        } else if (status == "3" && processStatus == "01") {
            return true
        } else if (status == "3" && processStatus == "03") {
            return true
        } else {
            return false
        }
    }

So verwenden Sie Enum

Das Schlechte an ** der Verwendung der bedingten Verzweigung ** ist, dass unklar ist, was jeder in der bedingten Verzweigung verwendete Wert bedeutet. In den meisten Fällen sollte das, was durch einen Codewert dargestellt wird, eine Bedeutung haben.

Der Verarbeitungsstatus "01" wartet auf die Verarbeitung, "02" wird verarbeitet. Zustand "1" ist normal, "2" ist ein Fehler. Dies sollte beispielsweise so etwas bedeuten, aber dieser bedingte Zweig kann es nicht lesen.

In solchen Fällen wird die Methode zum Definieren von Konstanten und zum Geben von Bedeutung angewendet. Wenn die Anzahl der Konstanten groß ist, wird es kompliziert, daher verwenden wir Enum zur Zusammenfassung.

Verwenden wir nun Enum, um eine Konstante zu erstellen und dem bedingten Zweig eine Bedeutung zu geben.

"Warten Sie, war es das Verdienst, Enum zu verwenden, um bedingte Verzweigungen sinnvoll zu machen?"

Ja, das ist richtig. Wenn Sie eine Bedeutung wünschen, können Sie entweder eine Konstante oder eine Aufzählung verwenden. (Wenn Sie eine aussagekräftige Einheit mit Konstanten als Design erstellen möchten, finde ich Enum gut.)

Wenn Sie die Tatsache verwenden möchten, dass Enum eine Klasse ist, versuchen Sie, sie ein wenig mehr wie eine Klasse zu verwenden.

Gruppieren Sie in der folgenden Verarbeitung nach Status (Zeile) und erstellen Sie eine Aufzählung, die einen Booleschen Wert basierend auf der Kombination aus Verarbeitungsstatus und Status zurückgibt. Das Konzept der Verarbeitung ist das gleiche wie bei der ** Methode mit bedingter Verzweigung **.


enum class StatusEnum {

    //Definieren Sie Enum im Status
    //True, wenn der Status 1 und der Verarbeitungsstatus 01 ist
    STATUS_1 {
        override fun validate(status: String, processStatus: String): Boolean {
            return status == "1" && processStatus == "01"
        }
    },
    //Zustand: 2 ist immer falsch
    STATUS_2 {
        override fun validate(status: String, processStatus: String): Boolean {
            return false
        }
    },
    //True, wenn der Status 3 ist und der Verarbeitungsstatus nicht 02 ist
    STATUS_3 {
        override fun validate(status: String, processStatus: String): Boolean {
            return status == "3" && processStatus != "02"
        }
    };

    abstract fun validate(status : String, processStatus : String) : Boolean

    //Überprüfen Sie die hier eingegebenen Informationen
    companion object {
        fun isStatusValidate(status : String, processStatus : String) : Boolean {
            for (item in values()) {
                val result = item.validate(status, processStatus)
                if (result) {
                    return result
                }
            }
            return false
        }
    }
}

Enum überprüft den Status, für den es zuständig ist, während es nach Status zusammengefasst wird und dem Zeichenliteral selbst eine Bedeutung gibt. In dem von außen verwendeten isStatusValidate () wird die Verarbeitung von Enum aufgerufen und das Ergebnis zurückgegeben. Ich werde. (Wenn Sie eine Bedeutung haben möchten, sollte die Bedeutung des Zustands selbst der Variablenname sein, aber hier ist es der Name, wie er zum Beispiel ist.)

Wenn sich der Status erhöht, sollte daher die Definition von Enum erhöht werden. Wenn sich der Verarbeitungsstatus ändert, muss nur die Rückgabeverarbeitung der betroffenen Enum geändert werden. Sie müssen keine langen bedingten Anweisungen überladen.

Serpentin

Im obigen Beispiel wird der Prozess zum Überprüfen des Eingabewerts im Enum-Prozess beschrieben. Da die Gruppe jedoch im Status erstellt wird, dachte ich, dass es einfacher wäre, der Gruppe die Bedeutung zu vermitteln, wenn es sich um eine Variable handelt. Es war.

Das Folgende ist ein Beispiel für die Übergabe des Status als Eingabe beim Generieren von Enum.


enum class StatusEnum(val status : String) {

    //Definieren Sie Enum im Status
    //True, wenn der Status 1 und der Verarbeitungsstatus 01 ist
    STATUS_1("1") {
        override fun validate(status: String, processStatus: String): Boolean {
            return this.status == status && processStatus == "01"
        }
    },
    //Zustand: 2 ist immer falsch
    STATUS_2("2") {
        override fun validate(status: String, processStatus: String): Boolean {
            return false
        }
    },
    //True, wenn der Status 3 ist und der Verarbeitungsstatus nicht 02 ist
    STATUS_3("3") {
        override fun validate(status: String, processStatus: String): Boolean {
            return this.status == status && processStatus != "02"
        }
    };

    abstract fun validate(status : String, processStatus : String) : Boolean

    companion object {
        fun isStatusValidate(status : String, processStatus : String) : Boolean {
            for (item in values()) {
                val result = item.validate(status, processStatus)
                if (result) {
                    return result
                }
            }
            return false
        }
    }
}

Hmm. Es ist wie eine Schlange.

Wenn der Variablenname von Enum ** Bedeutung des Status ** als Namen verwendet, wird "1" oder "2" als spezifischer Wert des Namens definiert und ob die Statusprüfung mit sich selbst identisch ist. Es sieht so aus, also ist es einfacher zu lesen ... aber ich habe das Gefühl, es spielt keine Rolle, zu welchem Sie kommen.

Am Ende

Es stellt sich heraus, dass die Verwendung der Tatsache, dass Enum eine Klasse ist, nicht nur die einfache Aufzählung von Konstanten ermöglicht, sondern auch die Verarbeitung und die Definition von Eigenschaften.

Dies führt zum Löschen unnötiger bedingter Anweisungen und zur Vereinfachung des Entwurfs (Reduzierung der Anzahl der zu schreibenden Codezeilen usw.). Daher hielt ich es für sinnvoll, verschiedene Aspekte in Betracht zu ziehen.

Recommended Posts

[Kotlin] Ein Beispiel für die Verarbeitung mit Enum
Beispiel für die Verwendung von vue.config.js
Beispiel für Parameter mit where
Beispiel für die Verwendung einer abstrakten Klasse
Beispiel für die Verwendung von ArAutoValueConverter (Feldtypkonvertierung)
Ein Beispiel, bei dem die Verwendung von Addition schneller ist als die Verwendung von StringBuilder (Java)
Anwendungsbeispiel für Java Enum
Implementierungsbeispiel eines einfachen LISP-Verarbeitungssystems (Java-Version)
Zusammenfassung der Verwendung von FragmentArgs
Implementierungsbeispiel eines einfachen LISP-Verarbeitungssystems (Ruby-Version)
[Java] [Kotlin] Rufen Sie valueOf und Werte von Enum generisch auf
Zusammenfassung der Verwendung von DBFlow
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern
Ausführen der Erstverarbeitung mit Spring Boot Command Line Runner
Reinigungsprozess japanischer Sätze
Zusammenfassung der Verwendung von ButterKnife
Datenverarbeitung mit Apache Flink
[Swift] Asynchrone Verarbeitung mit PromiseKit
[Verarbeitung] Versuchen Sie es mit GT Force.
CSV-Ausgabeverarbeitung mit Super-CSV
Zusammenfassung der Java-Fehlerverarbeitung
Implementierung von HashMap mit Kotlin
[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
Implementierungsbeispiel eines einfachen LISP-Verarbeitungssystems [Zusammenfassung jeder Sprachversion]