Mit knockout.js computed observables ist es möglich, eine JavaScript-Observable zu definieren, die von anderen Observablen abhängt, wobei ein funktionaler Ausdruck, z.Java-Äquivalent für Knockout.js berechnete Observablen?
var computedObservable = ko.computed(function(){
return firtName() + lastName();
});
Wenn eine der referenzierten Observablen (z.B. vorName) ändert, aktualisiert die berechnete beobachtbar ist automatisch. Die referenzierten Observablen sind durch den angegebenen Funktionsausdruck definiert und müssen nicht explizit angegeben werden.
Wie kann ich etwas Ähnliches in Java implementieren?
(Nun, es gibt JavaFx Bindings, aber sie bedürfen der ausdrücklichen Registrierung der referenzierten Eigenschaften/Observablen.)
I unterscheiden zwei Fälle:
a) Der Ausdruck Lambda wird analysiert, mit Java zu automatisch herausfinden, welche referenzierten Observablen berücksichtigt werden müssen. (Die genannten Observablen könnten weitere Observablen in einer Abhängigkeitskette verweisen.) Expected Beispielcode:
ComputedObservable<String> computedObservable = new ComputedObservable<>(() -> {
return firstName.get() + lastName.get();
});
b) ich manuell verwiesen beobachtbaren jeder registrieren, um sie zu beobachten. Ich möchte diesen Fall vermeiden. Mit anderen Worten ich nicht will Code hat wie
ComputedObservable<String> computedObservable = new CoputedObservable<>();
computedObservable.registerReference(firstName);
computedObservable.registerReference(lastName);
computedObservable.setExpresion(() -> {
return firstName.get() + lastName.get();
});
oder (mit JavaFx Bindings)
DoubleBinding db = new DoubleBinding() {
{
super.bind(a, b, c, d);
}
@Override
protected double computeValue() {
return (a.get() * b.get()) + (c.get() * d.get());
}
};
Ist Fall a) möglich, überhaupt und wenn ja, gibt es eine vorhandene Java-Implementierung/Bibliothek dafür?
Edit: Es gibt eine andere Strategie:
c) Verwenden spezialisierte Operatoren den funktionellen Ausdruck zu definieren. Diese Operatoren registrieren implizit die referenzierten Observablen. Es ist also kein zusätzlicher manueller Registrierungsschritt erforderlich. (Der Funktionsausdruck wird auf die verfügbaren Operatoren beschränkt, und die erweiterte Funktionalität erfordert möglicherweise die Implementierung neuer helfender Operatoren.
)StringBinding fullName = firstName.concat(secondName);
DoubleBinding result = a.multiply(b).add(c.multiply(d));
Verwandte Fragen:
- How to get Method Parameter names in Java 8 using reflection?
- Java 8: convert lambda to a Method instance with clousure included
- Reflection type inference on Java 8 Lambdas
- Swing data binding frameworks
Denken Sie daran, nur weil etwas in Javascript Sinn macht, bedeutet nicht, dass Sie versuchen sollten, es nach Java zu bringen. – Kayaman
Sind Ihre Zweifel bereits in den Widersprüchen enthalten, die ich in meiner Antwort mit der "Registrierungsstrategie" erwähnt habe? Oder gibt es weitere Punkte, die den Ansatz von knockout.j für Java unbrauchbar machen würden? – Stefan
Nun, mein Hauptpunkt war, dass, wo Javascript nativ so etwas unterstützt, es in Java keinen ähnlichen Mechanismus gibt. Das bedeutet, dass Sie kämpfen werden, um Java in Javascript schreiben zu können. Das ist oft ein Zeichen, dass Sie etwas falsch machen. So speichern Sie nicht relationale Daten in einem RDBMS. – Kayaman