1

我有一个私人列表,我不希望它可以从外部修改。只允许从外部添加,并且仅当对象有效时。因此我以前是这样写的:

private List<Object> list = new ArrayList<>();

public List<Object> getList()
{
    return Collections.unmodifiableList(list);
}

public void addObject(Object object)
{
    if (isObjectValid(object)) //any validation
        list.add(object);
}

现在出于 JavaFX 的目的,我将列表转换为一个属性:

private ListProperty<Object> list =
               new SimpleListProperty<>(FXCollections.observableArrayList());

为了从数据绑定等属性的好处中获利,ListChangeListener我必须将属性提供给外部世界。但是随后也提供了对列表的所有方法的访问。(使用 ReadOnlyListProperty 无效,因为列表实例本身永远不会改变。)我可以做些什么来实现所有目标:

  • 私有列表属性
  • ListChangeListener 可以从外部添加
  • 可用于从外部绑定依赖项(创建方法形成类 Bindings)
  • 不修改属性或列表实例本身
  • 仅通过我自己的方法从外部修改列表内容
4

1 回答 1

1

未测试,但尝试:

private ListProperty<Object> list = new SimpleListProperty<>(FXCollections.observableArrayList());

private ReadOnlyListWrapper<Object> publicList = new ReadOnlyListWrapper<>();

在构造函数中:

publicList.bind(Bindings.createObjectBinding(
    () -> FXCollections.unmodifiableObservableList(list.getValue()),
    list));

那么你的访问器方法是

public ReadOnlyListProperty<Object> getList() {
    return publicList.getReadOnlyProperty();
}
于 2016-01-12T02:27:43.040 回答