Como criar uma propriedade somente leitura em JavaFX

Embora em JavaFX uma propriedade só de leitura tem menos funcionalidades do que uma leitura imóvel / escrever, é realmente mais complicado de implementar. Por quê? Porque internamente - dentro da classe que contém a propriedade somente leitura - você precisa ser capaz de ler ou escrever o valor da propriedade. Mas externamente - ou seja, fora da classe que define a propriedade somente leitura - você deve garantir que os usuários podem ler, mas não escrever o valor da propriedade.

Você pode pensar que omitir o método setter seria suficiente para criar uma propriedade somente leitura. Mas o problema é que, além de métodos get e set, propriedades JavaFX também expor um método de acesso propriedade que fornece acesso directo ao próprio objeto imóvel.

O que se segue é um exemplo de como não para criar uma propriedade somente leitura:

StringProperty firstName = new SimpleStringProperty (this, "Nome", "") -public getFirstName final String () {return firstName.get () -} público final StringProperty firstNameProperty () {return firstName-}

Este código é o mesmo que o código utilizado para criar uma propriedade de leitura / escrita, excepto que se omitiu o setFirstName método. Infelizmente, esta definição de propriedade não impede que os usuários da classe que define a propriedade de modificar a propriedade. Para fazer isso, tudo que o usuário precisa fazer é acessar a propriedade e, em seguida, chamar a propriedade da conjunto Método directamente.

Por exemplo, suponha que esta propriedade faz parte de uma classe chamada Cliente, um exemplo de que é referenciado pela variável cust. O código a seguir iria definir o valor da propriedade só de leitura:

. Cust.getFirstName () set ( "Bogus Value") -

Para criar uma propriedade somente leitura com segurança, você deve realmente criar duas cópias do imóvel: uma versão só de leitura e uma versão de leitura / gravação. O read-only versão será exposta ao mundo exterior.

A versão de leitura / gravação será usado internamente, dentro da classe que define a propriedade. Em seguida, você deve sincronizar essas duas propriedades para que sempre que o valor da leitura interna / escrever alterações de propriedade, o valor da propriedade só de leitura externo é atualizado automaticamente.

Para conseguir isso, JavaFX fornece duas classes adicionais para cada tipo de dados de propriedade: uma classe propriedade só de leitura e uma classe wrapper somente leitura. A classe de propriedade só de leitura é o que você compartilhar com o mundo exterior através do método de propriedade de acesso. A classe wrapper somente leitura é o que você usa para criar o campo privada usada para fazer referência a propriedade dentro do programa.

Aqui está um exemplo completo que implementa uma propriedade de inteiro somente leitura chamada número do cliente em uma classe chamada Cliente:

public class Cliente {ReadOnlyIntegerWrapper CUSTOMERNUMBER = new ReadOnlyIntegerWrapper (this, "CUSTOMERNUMBER", 0) -public última Integer getCustomerNumber () {return customerNumber.get () -} ReadOnlyIntegerProperty public final () customerNumberProperty () {return customerNumber.getReadOnlyProperty () - } // mais detalhes da classe aqui}

A chave para entender como isso funciona é perceber que a classe wrapper somente leitura é uma extensão da classe propriedade simples que adiciona apenas um novo método: getReadOnlyProperty, que retorna uma cópia somente leitura da propriedade simples. Essa cópia só de leitura é sincronizado automaticamente com a propriedade simples, de modo que sempre que uma alteração é feita para a propriedade simples subjacente, o valor da propriedade somente leitura será alterado também.

menu