Почему в JavaFX ReadOnlyXPropety реализует интерфейс ObservableValue - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь понять API свойств JavaFX и заметил, что ReadOnlyBooleanProperty, ReadOnlyStringProperty и другие классы ReadOnlyXPropety реализуют интерфейс ObservableValue.Зачем нам нужно менять слушателей на свойства только для чтения?Или я чего-то не понимаю ...

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Свойство только для чтения не обязательно означает, что значение этого свойства никогда не изменится, это просто означает, что его нельзя изменить извне .

Примером этого являетсяинтерфейс Worker и его абстрактные реализации, такие как Task.A Worker имеет различные свойства только для чтения, включая: title, message, progress, value и т. Д. Эти свойства предназначены для передачи информации о прогрессе Task в пользовательском интерфейсе.Имея это в виду, нет смысла позволять изменять эти свойства из внешнего источника.Но он все равно должен обеспечивать способ изменения этих свойств из фоновой задачи.В Task это делается с помощью защищенных updateMessage, updateProgress и других методов.

Внутренне это достигается с помощью классов ReadOnlyXXXWrapper.Эти реализации расширяют свои соответствующие SimpleXXXProperty классы, но предоставляют специализированный ReadOnlyXXXProperty, который действительно только для чтения.Под «истинно» я имею в виду, что он не реализует WritableValue.Это выглядит примерно так:

public class SomeClass {

    private final ReadOnlyStringWrapper message = new ReadOnlyStringWrapper(this, "message");

    private void setMessage(String message) {
         this.message.set(message); 
    }

    public final String getMessage() { 
        return message.get(); 
    }

    public final ReadOnlyStringProperty messageProperty() {
        return message.getReadOnlyProperty();
    }

}

Обратите внимание, что установщик позволяет только самому классу изменять свойство.Для остального мира собственность полностью доступна только для чтения.

0 голосов
/ 19 октября 2018

Класс ReadOnlyProperty является только оболочкой, которая может быть отображена как (буквально) только для чтения.В обороте значение все еще может измениться.

Посмотрите на ReadOnlyObjectWrapper примеры.Они часто используются приватно для изменения значения, в то время как свойство, возвращаемое из ReadOnlyPropertyWrapper#getReadOnlyProperty(), используется для предоставления ObservableProperty как доступного только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...