我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList.
然后,我想使用它来显示过滤器数据,当过滤器设置时,也可以在必要时恢复,这里是MCVE:
package br; import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Main{ private static ObservableList<Foo> masterData = FXCollections.observableArrayList(); private static ObservableList<Foo> filteredData = FXCollections.observableArrayList(); static Filter filter = new Filter(); public static void addDummy(){ masterData.add(new Foo("a",1)); masterData.add(new Foo("aa",3)); masterData.add(new Foo("b",2)); masterData.add(new Foo("bb",4)); masterData.add(new Foo("c",3)); } public static void printData(ObservableList<Foo> list){ for(Foo f: list) System.out.println(f.getName()); } public static void main(String[] args) { addDummy(); applyFilter(3); printData(filteredData); applyFilter(0); printData(filteredData); } public static void applyFilter(int num){ filter.setData(masterData); filter.setFilter(num); filteredData = filter.getData(); } }
类过滤器,我用来过滤数据:
package br; import java.util.ArrayList; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Filter { private ObservableList<Foo> data = FXCollections.observableArrayList(); public void setFilter(int filter){ List<Foo> copy = new ArrayList<Foo>(data); for(Foo f: copy) if(f.getBar()<filter) data.remove(f); } public ObservableList<Foo> getData() { return data; } public void setData(ObservableList<Foo> data) { this.data = data; } }
而Foo类只是一个String Name和一个int bar(加上getter / setter)
package br; public class Foo { private String name; private int bar; public Foo(String name,int bar){ this.setBar(bar); this.setName(name); } public String getName() {return name;} public void setName(String name) {this.name = name;} public int getBar() {return bar;} public void setBar(int bar) {this.bar = bar;} }
当您运行此代码时,您将获得:
aa
bb
c
当过滤器设置为3(过滤数据如预期)和过滤器“重置”为零后.
如何确保过滤器始终使用masterData中的数据进行处理,然后存储在filteredData上?
注意:这是一个JavaFX项目,所以我真的需要使用ObservableList.
解决方法
问题
public void setData(ObservableList<Foo> data) { this.data = data; }
说明
如果您想知道Java遵守Pass By Value,并且masterData的值应该已被复制到列表数据.你是对的 !但是这个故事只是一点点扭曲
原始图像的变化,值被传递,但是对象的对象,对象引用被按值传递.
因此,您正在引用masterData的Object,而不是将值复制到新的List!
解
this.data = FXCollections.observableArrayList(data);
这将创建一个新的对象以供数据引用,所有的操作都将在这个新对象的数据上完成.