我正在尝试将Clothing
个对象从另一个类中的重写方法添加到arraylist,这会强制它被声明为final。但是,当一个变量被声明为final时,它无法更改,但这正是我需要做的。这是代码:
final List<Clothing> clothingItems = new ArrayList<>();
mClothingRef.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot snapshot, String s) {
Clothing clothing = snapshot.getValue(Clothing.class);
clothingItems.add(clothing);
}
}
我如何解决clothingItems
是最终的事实,以便clothingItems
列表填充Clothing
个对象?
答案 0 :(得分:0)
final
不是您的问题 - 您可以将元素添加到最终列表中:
final List<Integer> items = new ArrayList<>();
System.out.println(Arrays.toString(items.toArray())); // Prints []
items.add(1);
items.add(2);
items.add(3);
System.out.println(Arrays.toString(items.toArray())); // Prints [1,2,3]
你不能做什么(在编译时被阻止)是将items
变量重新分配给其他任何东西:
final List<Integer> items = new ArrayList<>();
System.out.println(Arrays.toString(items.toArray()));
items.add(1);
items.add(2);
items.add(3);
System.out.println(Arrays.toString(items.toArray()));
items = new ArrayList<>(); //Compile error here
如果它看起来没有被填充,那么这里还有另一个问题 - 它与它的最终事实无关。在任何情况下,如果你确实遇到了最终问题,那么你将得到编译错误,而不是在运行时抛出异常。
答案 1 :(得分:0)
根据您的匿名类ChildEventListener是否被触发,对clothingItems.size()
的调用会给出不同的答案。
final List<Clothing> clothingItems = new ArrayList<>();
mClothingRef.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot snapshot, String s) {
Clothing clothing = snapshot.getValue(Clothing.class);
clothingItems.add(clothing);
}
}
// if addChildEvent is triggered then clothingItems will be updated otherwise it will still have the same value
System.out.println(clothingItems.size());