Je voulais juste créer une propriété réactive en Java

Aperçu

Il n'y a pas longtemps, j'ai écrit un article tel que "JavaFX peut faire assez de liaison de données!" Impression de création d'une application chronomètre avec Java + JavaFX + MVVM Ce n'est pas sufisant! Pas assez! ** Plus précisément ** Je veux écrire en génériques! ** ** C'est une «propriété de chaîne», une «propriété booléenne», ** Vous ne pensiez pas que c'était un millimètre de merde lorsque vous l'avez implémentée ** et a été nommé pour demander aux développeurs Java (Sun ou Oracle) pendant une heure. Je regardais le cours dans lequel j'étais. "Alors faisons une propriété réactive après avoir pratiqué les génériques."

Sur quoi baser

Pour le moment, j'ai décidé d'hériter de l'interface Propriété <T> tout en ayant une instance de type Propriété <T> à l'intérieur. L'entité doit être un SimpleObjectProperty <T> qui hérite de la Property <T>, peut-être.

sample1.java


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

Puisque nous avons hérité de la propriété , nous devons naturellement implémenter diverses méthodes, mais nous les avons toutes jetées dans l'instance interne (le code est omis car il est redondant). Cependant, il est désagréable d'avoir à écrire un cast quand le type ʻObject est une méthode d'argument, comme public void setValue (Object value) {this.value.setValue ((T) value);} `. n'est-ce pas…….

Implémentons une méthode de type ReactiveProperty

Je vise une alternative, donc j'aimerais implémenter des méthodes majeures telles que «Select» et «Subscribe». Concernant la méthode de notification, comme l'instance interne a la méthode ʻaddListener`, j'ai décidé de l'ajouter ici. C'est incroyable que la fonction de notification fonctionne correctement avec juste cela. Cependant, Java n'a pas le concept de "méthode d'extension", donc le résultat de "Select" devient soudainement "ReactiveProperty " et "ToReactiveProperty" remplace "StringProperty etc. par ReactiveProperty ". C'est juste une méthode pour vous.

sample2.java


public class ReactiveProperty<T> implements Property<T> {
    //Créer ReactiveProperty à partir de 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;
    }
    //Créer une propriété réactive à partir de deux propriétés réactives
    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;
    }
    //Créer une propriété réactive à partir de ◯◯ Propriété
    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;
    }
    //Modifier la fonction de notification
    public void subscribe(Consumer<T> cons){
        this.addListener((sb, oldValue, newValue) -> {cons.accept(this.getValue());});
    }
}

Résumé

En implémentant comme ci-dessus, nous avons pu créer une propriété avec notification par génériques. Lorsque je l'ai apporté à un projet JavaFX et que je l'ai utilisé, il hérite de Property <T>, donc il peut être correctement Data Binding avec la propriété du contrôle, donc cela semble être assez utile.

Code source complet

Veuillez noter qu'il s'agit d'un code merdique écrit par un débutant Java. Je suis désolé que le nom du package soit Pour ceux qui ont implémenté LINQ en Java. Est-il également nécessaire de changer le nom du modèle ...?

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;
    //constructeur
    public ReactiveProperty(){
        value = new SimpleObjectProperty<>();
    }
    public ReactiveProperty(T t){
        value = new SimpleObjectProperty<>(t);
    }

    //Parce qu'il hérite de l'interface Property ...
    @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();}

    //Créer ReactiveProperty à partir de 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;
    }
    //Créer une propriété réactive à partir de deux propriétés réactives
    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;
    }
    //Créer une propriété réactive à partir de ◯◯ Propriété
    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;
    }
    //Modifier la fonction de notification
    public void subscribe(Consumer<T> cons){
        this.addListener((sb, oldValue, newValue) -> {cons.accept(this.getValue());});
    }
}

Recommended Posts

Je voulais juste créer une propriété réactive en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai créé un client RESAS-API en Java
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Comment créer un environnement Java en seulement 3 secondes
J'ai essayé de créer une compétence Clova en Java
J'ai créé un PDF avec Java.
Comment créer un conteneur Java
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Comment créer un tableau Java
Je voulais penser avoir compris les types personnalisés d'Elm en Java
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
Comment créer un résumé de calendrier Java
Facile à créer Slack Bot avec Java
Comment créer un robot Discord (Java)
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
[JAVA] Project Euler, je suis resté coincé au Q8, alors prenez note
Je voulais mettre en place un diaporama de manière à la mode avec slick.
Je veux ForEach un tableau avec une expression Lambda en Java
J'ai créé un programme de jugement des nombres premiers en Java
Deux façons de démarrer un thread en Java + @
J'ai essayé de faire une authentification de base avec Java
Je souhaite envoyer un e-mail en Java.
Comment afficher une page Web en Java
java j'ai essayé de casser un simple bloc
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai créé un jeu Janken en Java (CLI)
rsync4j --Je veux toucher rsync en Java.
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de créer une compétence Alexa avec Java
J'ai écrit un programme de factorisation prime en Java
J'ai essayé de casser le bloc avec java (1)
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Faites un blackjack avec Java
Quand j'ai voulu créer une méthode pour Premium Friday, c'était déjà dans l'API standard Java 8
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Créez "Je ne suis pas un robot" en Java EE (Jakarta EE)
Je veux faire quelque chose comme "cls" en Java
J'ai essayé d'implémenter la notification push Firebase en Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
[Mémo personnel] Créez une copie complète simple avec Java
Comment créer un URI de données (base64) en Java
Je souhaite définir une fonction dans la console Rails
Ce que j'ai appris lors de la création d'un serveur en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java