JavaFX - ReadOnlyProperty не только для чтения - PullRequest
0 голосов
/ 12 мая 2018

Я просматривал Property API и заметил, что свойства ReadOnly на самом деле являются подклассом Properties.Сначала я подумал, что это нормально, поскольку, если объект является ReadOnlyProperty, он не может восстановить методы внутри Property.Однако это не так, вы можете легко настроить тип, чтобы полностью обойти часть только для чтения.

public static void change(ReadOnlyIntegerProperty y)
{
    if (y instanceof IntegerProperty)
    {
        IntegerProperty z = (IntegerProperty)y;
        z.set(10);
    }
}

Это задумано специально?Я понимаю, что ReadOnlyProperties - это скорее руководство для программиста.Но на самом деле это не значит, что в API JavaFX некоторые свойства предоставляются как ReadOnly, и затем могут быть изменены?Например: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html

public final ReadOnlyObjectProperty<Scene> sceneProperty

Я мог бы просто привести это значение к ObjectProperty<Scene>, и теперь я могу потенциально вызвать неопределенное поведение в библиотеке.

Я пытаюсь реализовать Property на другом языке, который их не поддерживает.Что может быть хорошим способом предотвратить это?

1 Ответ

0 голосов
/ 12 мая 2018

Вы должны использовать ReadOnlyIntegerWrapper, который имеет доступную для чтения и доступную только для чтения часть. Записываемая часть - это то, что вы можете использовать внутри, как будто это обычное свойство, а часть только для чтения - это то, что вы возвращаете вызывающим:

public class Test {
   private final ReadOnlyIntegerWrapper foo = new ReadOnlyIntegerWrapper();

   public Test() {
        foo.set(42);
   }

   public final javafx.beans.property.ReadOnlyIntegerProperty fooProperty() {
       return this.foo.getReadOnlyProperty();
    }   


   public final int getFoo() {
      return this.fooProperty().get();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...