arraylist最终解决方案,以便可以将项目添加到其中

时间:2017-12-20 11:01:14

标签: java interface final

我正在尝试将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个对象?

2 个答案:

答案 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());