Ich wollte nur eine reaktive Eigenschaft in Java erstellen

Überblick

Vor nicht allzu langer Zeit schrieb ich einen Artikel wie "JavaFX kann genug Datenbindung!" Eindruck der Erstellung einer Stoppuhr-App mit Java + JavaFX + MVVM ** Dies ist jedoch nicht genug! Nicht genug! ** Speziell ** Ich möchte in Generics schreiben! ** ** ** Es ist eine "String-Eigenschaft", eine "Boolesche Eigenschaft". ** Hast du nicht gedacht, dass es ein Millimeter Scheiße war, als du sie implementiert hast? ** und wurde benannt, um Java-Entwickler (Sun oder Oracle) eine Stunde lang zu fragen. Ich habe mir die Klasse angesehen, in der ich war. "Dann machen wir eine reaktive Eigenschaft, nachdem wir Generika geübt haben."

Was zu stützen

Vorerst habe ich beschlossen, die Schnittstelle "Property " zu erben, während eine Instanz vom Typ "Property " darin enthalten ist. Die Entität sollte eine SimpleObjectProperty sein, die möglicherweise von der Eigenschaft erbt.

sample1.java


public class ReactiveProperty<T> implements Property<T> {
    private Property<T> value;
    //Konstrukteur
    public ReactiveProperty(){
        value = new SimpleObjectProperty<>();
    }
    public ReactiveProperty(T t){
        value = new SimpleObjectProperty<>(t);
    }
}

Da wir "Property " geerbt haben, müssen wir natürlich verschiedene Methoden implementieren, aber wir haben sie alle in die interne Instanz geworfen (der Code wird weggelassen, weil er redundant ist). Es ist jedoch unangenehm, eine Umwandlung schreiben zu müssen, wenn der Typ "Object" eine Argumentmethode ist, z. B. "public void setValue (Object value) {this.value.setValue ((T) value);}". nicht wahr…….

Lassen Sie uns eine ReactiveProperty-ähnliche Methode implementieren

Ich strebe eine Alternative an, daher möchte ich wichtige Methoden wie "Auswählen" und "Abonnieren" implementieren. In Bezug auf die Benachrichtigungsmethode habe ich beschlossen, diese dort hinzuzufügen, da die interne Instanz über eine Methode "addListener" verfügt. Es ist erstaunlich, dass die Benachrichtigungsfunktion genau damit richtig funktioniert. Java hat jedoch nicht das Konzept der "Erweiterungsmethode", so dass das Ergebnis von "Select" plötzlich zu "ReactiveProperty " wird und "ToReactiveProperty" "StringProperty usw." durch "ReactiveProperty " ersetzt. Es ist nur eine Methode für Sie.

sample2.java


public class ReactiveProperty<T> implements Property<T> {
    //Erstellen Sie ReactiveProperty aus ReactiveProperty
    public <R> ReactiveProperty<R> select(Function<T, R> func){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(func.apply(this.getValue()));
        this.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply((T)newValue));});
        return retVal;
    }
    //Erstellen Sie eine reaktive Eigenschaft aus zwei reaktiven Eigenschaften
    public <U, R> ReactiveProperty<R> combineLatest(ReactiveProperty<U> u, BiFunction<T, U, R> func){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(func.apply(this.getValue(), u.getValue()));
        this.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply((T)newValue, u.getValue()));});
        u.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply(this.getValue(), (U)newValue));});
        return retVal;
    }
    //Erstellen Sie eine reaktive Eigenschaft aus der Eigenschaft ◯◯
    public static <R> ReactiveProperty<R> ToReactiveProperty(Property<R> r){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(r.getValue());
        r.addListener((sb, oldValue, newValue)->{retVal.setValue(r.getValue());});
        return retVal;
    }
    //Benachrichtigungsfunktion ändern
    public void subscribe(Consumer<T> cons){
        this.addListener((sb, oldValue, newValue) -> {cons.accept(this.getValue());});
    }
}

Zusammenfassung

Durch die Implementierung wie oben konnten wir eine Eigenschaft mit Benachrichtigung durch Generika erstellen. Wenn ich es in ein JavaFX-Projekt gebracht und verwendet habe, erbt es "Property ", sodass es ordnungsgemäß mit der Eigenschaft des Steuerelements verbunden werden kann. Es scheint also nützlich genug zu sein.

Ganzer Quellcode

Bitte beachten Sie, dass dies ein beschissener Code ist, der von einem Java-Anfänger geschrieben wurde. Es tut mir leid, dass der Paketname [Für diejenigen, die LINQ in Java implementiert haben] lautet (https://qiita.com/kasecato/items/ec7ab8b392fa8bb0a732#%E8%AA%B2%E9%A1%8C). Muss auch der Modellname geändert werden ...?

ReactiveProperty.java


package com.github.jrper;

import javafx.beans.InvalidationListener;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;

public class ReactiveProperty<T> implements Property<T> {
    private Property<T> value;
    //Konstrukteur
    public ReactiveProperty(){
        value = new SimpleObjectProperty<>();
    }
    public ReactiveProperty(T t){
        value = new SimpleObjectProperty<>(t);
    }

    //Weil es die Eigenschaftsschnittstelle erbt ...
    @Override
    public void addListener(ChangeListener listener) {value.addListener(listener);}
    @Override
    public void removeListener(ChangeListener listener) {value.removeListener(listener);}
    @Override
    public void setValue(Object value){this.value.setValue((T)value);}
    @Override
    public void bind(ObservableValue observable) {value.bind(observable);}
    @Override
    public void unbind() {value.unbind();}
    @Override
    public boolean isBound() {return value.isBound();}
    @Override
    public void bindBidirectional(Property other) {value.bindBidirectional(other);}
    @Override
    public void unbindBidirectional(Property other) {value.unbindBidirectional(other);}
    @Override
    public Object getBean() {return value.getBean();}
    @Override
    public String getName() {return value.getName();}
    @Override
    public void addListener(InvalidationListener listener) {value.addListener(listener);}
    @Override
    public void removeListener(InvalidationListener listener) {value.removeListener(listener);}

    // getter
    public T getValue(){return value.getValue();}

    //Erstellen Sie ReactiveProperty aus ReactiveProperty
    public <R> ReactiveProperty<R> select(Function<T, R> func){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(func.apply(this.getValue()));
        this.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply((T)newValue));});
        return retVal;
    }
    //Erstellen Sie eine reaktive Eigenschaft aus zwei reaktiven Eigenschaften
    public <U, R> ReactiveProperty<R> combineLatest(ReactiveProperty<U> u, BiFunction<T, U, R> func){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(func.apply(this.getValue(), u.getValue()));
        this.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply((T)newValue, u.getValue()));});
        u.addListener((sb, oldValue, newValue)->{retVal.setValue(func.apply(this.getValue(), (U)newValue));});
        return retVal;
    }
    //Erstellen Sie eine reaktive Eigenschaft aus der Eigenschaft ◯◯
    public static <R> ReactiveProperty<R> ToReactiveProperty(Property<R> r){
        ReactiveProperty<R> retVal = new ReactiveProperty<>(r.getValue());
        r.addListener((sb, oldValue, newValue)->{retVal.setValue(r.getValue());});
        return retVal;
    }
    //Benachrichtigungsfunktion ändern
    public void subscribe(Consumer<T> cons){
        this.addListener((sb, oldValue, newValue) -> {cons.accept(this.getValue());});
    }
}

Recommended Posts

Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe ein PDF mit Java erstellt.
So erstellen Sie einen Java-Container
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
So erstellen Sie ein Java-Array
Ich wollte glauben, ich hätte Elms benutzerdefinierte Typen in Java verstanden
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
So erstellen Sie eine Java-Kalenderzusammenfassung
Einfach, Slack Bot mit Java zu machen
Wie erstelle ich einen Discord Bot (Java)
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
[JAVA] Projekt Euler, ich steckte im achten Quartal fest
Ich wollte eine Diashow mit Slick modisch umsetzen.
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich möchte eine E-Mail in Java senden.
So zeigen Sie eine Webseite in Java an
Java Ich habe versucht, einen einfachen Block zu brechen
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
rsync4j - Ich möchte rsync in Java berühren.
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Ich habe versucht, den Block mit Java zu brechen (1)
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Machen Sie einen Blackjack mit Java
Als ich eine Methode für Premium Friday erstellen wollte, war sie bereits in der Java 8-Standard-API enthalten
Lassen Sie uns eine TODO-Anwendung mit Java 2 erstellen. Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hello-Welt erstellen
Machen Sie "Ich bin kein Roboter" in Java EE (Jakarta EE)
Ich möchte so etwas wie "cls" in Java machen
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
[Persönliches Memo] Erstellen Sie eine einfache, tiefe Kopie mit Java
So erstellen Sie einen Daten-URI (base64) in Java
Ich möchte eine Funktion in der Rails Console definieren
Was ich beim Erstellen eines Servers in Java gelernt habe
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java