Свойство только для чтения не обязательно означает, что значение этого свойства никогда не изменится, это просто означает, что его нельзя изменить извне .
Примером этого являетсяинтерфейс 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();
}
}
Обратите внимание, что установщик позволяет только самому классу изменять свойство.Для остального мира собственность полностью доступна только для чтения.