Antes de nós irmos para o próximo método criando bindings, nós precisamos ver alguns detalhes sobre a natureza genérica das interfaces e de suas especializações type-specific.
Em exemplos anteriores foram inclusas classes como IntegerProperty, StringProperty e DoubleBindings<T>. Por causa do tipo primitivo do Java e da referência do tipo dicotomia, diretamente utiliza os tipos genéricos, tais como as Property<Integer>, enquanto lida com valores primitivos incorre em ineficiências de boxe e unboxing.
Para aliviar esse custo, especializações type-specific do tipo genérico são construídos pelos valores do tipo primitivo boolean, int, long, float e double de tal maneira de quando seus métodos get() ou set() são chamados, e quando faz os seus cálculos internos, os tipos primitivos nunca são encaixotados e desencaixotados.
Especializações similares são também construídas pela a String e Objetos dos tipos de referência por razões uniformes. Isso explica a existência das classes BooleanProperty, IntegerProperty, LongProperty, FloatProperty, DoubleProperty, StringProperty e ObjectProperty.
Cuidado: Não seja enganado pelo nome IntegerProperty achando que é um container de um objeto Integer. Na verdade, não é. É um container dos valores do primitivo int. O mesmo acontece para as outras classes baseadas nos primitivos.
Outro aspecto das especializações type-specific é que a especialização para numera os tipos primitivos são derivados utilizando Number com um tipo de parâmetro. Na prática é que qualquer property numérica pode ser chamada pelo bind() em qualquer outro numérico property ou binding. Exemplo:
Código
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package main.java.br.com.cursojavanow; import javafx.beans.property.DoubleProperty; import javafx.beans.property.FloatProperty; import javafx.beans.property.IntegerProperty; import javafx.beans.property.LongProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleFloatProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleLongProperty; public class NumericPropertiesExample { public static void main(String[] args) { IntegerProperty i = new SimpleIntegerProperty(null, "i", 1024); LongProperty l = new SimpleLongProperty(null, "l", 0L); FloatProperty f = new SimpleFloatProperty(null, "f", 0.0F); DoubleProperty d = new SimpleDoubleProperty(null, "d", 0.0); System.out.println("Constructed numerical" + " properties i, l, f, d."); System.out.println("i.get() = " + i.get()); System.out.println("l.get() = " + l.get()); System.out.println("f.get() = " + f.get()); System.out.println("d.get() = " + d.get()); l.bind(i); f.bind(l); d.bind(f); System.out.println("Bound l to i, f to l, d to f."); System.out.println("i.get() = " + i.get()); System.out.println("l.get() = " + l.get()); System.out.println("f.get() = " + f.get()); System.out.println("d.get() = " + d.get()); System.out.println("Calling i.set(2048)."); i.set(2048); System.out.println("i.get() = " + i.get()); System.out.println("l.get() = " + l.get()); System.out.println("f.get() = " + f.get()); System.out.println("d.get() = " + d.get()); d.unbind(); f.unbind(); l.unbind(); System.out.println("Unbound l to i, f to l, d to f."); f.bind(d); l.bind(f); i.bind(l); System.out.println("Bound f to d, l to f, i to l."); System.out.println("Calling d.set(10000000000L)."); d.set(10000000000L); System.out.println("d.get() = " + d.get()); System.out.println("f.get() = " + f.get()); System.out.println("l.get() = " + l.get()); System.out.println("i.get() = " + i.get()); } } |
Saida
Constructed numerical properties i, l, f, d.
i.get() = 1024
l.get() = 0
f.get() = 0.0
d.get() = 0.0
Bound l to i, f to l, d to f.
i.get() = 1024
l.get() = 1024
f.get() = 1024.0
d.get() = 1024.0
Calling i.set(2048).
i.get() = 2048
l.get() = 2048
f.get() = 2048.0
d.get() = 2048.0
Unbound l to i, f to l, d to f.
Bound f to d, l to f, i to l.
Calling d.set(10000000000L).
d.get() = 1.0E10
f.get() = 1.0E10
l.get() = 10000000000
i.get() = 1410065408
Fonte: The Definitive Guide to Modern Java Clients with JavaFX
Deixe um comentário