¿Cómo crear una propiedad de sólo lectura en JavaFX
Aunque en JavaFX una propiedad de sólo lectura tiene menos funcionalidad que una lectura de propiedad / escritura, en realidad es más complicada de implementar. ¿Por qué? Debido interna - dentro de la clase que contiene la propiedad de sólo lectura - que necesita para ser capaz de leer o escribir el valor de la propiedad. Pero el exterior - es decir, fuera de la clase que define la propiedad de sólo lectura - debe asegurarse de que los usuarios pueden leer, pero no escribir el valor de la propiedad.
Se podría pensar que la omisión del método setter sería suficiente para crear una propiedad de sólo lectura. Pero el problema es que, además de los métodos getter y setter, propiedades JavaFX también exponen un método propiedad de acceso que proporciona acceso directo al propio objeto de propiedad.
El siguiente es un ejemplo de cómo no para crear una propiedad de sólo lectura:
StringProperty firstName = new SimpleStringProperty (esto "firstName", "") -públicos última cadena getFirstName () {return firstName.get () -} pública final StringProperty firstNameProperty () {return firstName-}
Este código es el mismo que el código utilizado para crear una propiedad de lectura / escritura, excepto que omite el setFirstName método. Por desgracia, esta definición de propiedad no impide que los usuarios de la clase que define la propiedad de modificar la propiedad. Para ello, todo el usuario tendría que hacer es acceder a la propiedad y luego llamar a la propiedad de conjunto método directo.
Por ejemplo, supongamos que esta propiedad es parte de una clase llamada Cliente, una instancia de los cuales se hace referencia por la variable cust. El siguiente código establecería el valor de la propiedad de sólo lectura:
. cust.getFirstName () conjunto ("Bogus Valor") -
Para crear una propiedad de sólo lectura de forma segura, debe crear en realidad dos copias de la propiedad: una versión de sólo lectura y una versión de lectura / escritura. La única lectura versión estará expuesto al mundo exterior.
La versión de lectura / escritura se utiliza internamente, dentro de la clase que define la propiedad. Luego, debe sincronizar estos dos propiedades de manera que cada vez que el valor de la lectura interna / escribir los cambios de propiedad, el valor de la propiedad de sólo lectura externa se actualiza automáticamente.
Para lograr esto, JavaFX proporciona dos clases adicionales para cada tipo de datos propiedad: una clase de propiedad de sólo lectura y una clase contenedora de sólo lectura. La clase de propiedad de sólo lectura es el que usted comparta con el mundo exterior a través del método de acceso de propiedad. La clase contenedora de sólo lectura es el que se utiliza para crear el campo privado utilizado para hacer referencia a la propiedad dentro del programa.
He aquí un ejemplo completo que implementa una propiedad de entero de sólo lectura llamado número de cliente en una clase llamada Cliente:
public class Cliente {ReadOnlyIntegerWrapper CustomerNumber = new ReadOnlyIntegerWrapper (esto "CustomerNumber", 0) -públicos última Entero getCustomerNumber () {return customerNumber.get () -} ReadOnlyIntegerProperty public final () customerNumberProperty () {return customerNumber.getReadOnlyProperty () - } // más detalles de clase van aquí}
La clave para entender cómo funciona esto es darse cuenta de que la clase contenedora de sólo lectura es una extensión de la clase de resistencia simple que agrega sólo un nuevo método: getReadOnlyProperty, que devuelve una copia de sólo lectura de la propiedad simple. Esta copia de sólo lectura se sincroniza automáticamente con la propiedad sencilla, de manera que cada vez que se realiza un cambio en la propiedad sencilla subyacente, el valor de la propiedad de sólo lectura se cambiará también.