为什么最终 collection 仍然会更新?

Why does a final collection still get updated?

我在这段代码中存储了两个 collection,然后添加了一个事件侦听器(这里没有 lambda - 我需要坚持使用 Java 7 ;))。

    // rri is a ReturnRequestInterface 
    final Collection<BigDecimal> selectedItems = rri.getSelected();
    final Collection<BigDecimal> unselectedItems = rri.getUnSelected();

    rri.addInformationChangeEventListener(new ComponentInformationChangeListener() {

        @Override
        public void informationChange(RequestChangeEvent event) {

            ReturnRequestInterface source = (ReturnRequestInterface) event.getSource();
            boolean debug1 = source.getSelected().containsAll(selectedItems);
            boolean debug2 = source.getUnSelected().containsAll(unselectedItems);

        }

    });

我最初对此进行了调试,collection 已正确设置。它不包含 objects,因为代码刚刚初始化。

调试侦听器(事件被触发是因为进行了项目选择)让我感到困惑。布尔值 debug1debug2 都为真,因为 collection selectedItemsunselectedItems 根据项目选择进行了更新。因此,事件源 collection 包含与声明的最终 collections(selectedItemsunselectedItems)相同的项目。

声明的两个最终 collection 不必保持原样吗?

final 简单的说,一个声明为 final 的变量不能被改变,而 class 即 final 不能被继承。 所有非原始变量都是 Java 中的引用,这意味着它们 'point' 或引用对象的实例,但它们本身不是对象。

你指的是不可变对象,它是一个 final class 的实例,它的所有字段都是 finalprivate 并且没有设置器。

希望这有助于澄清。

使用final仅意味着不能将引用更改为指向另一个对象,而不是其内容是否可以更新。

如果您想要一个不可修改的集合,请使用 Collections.unmodifiableSet(yourSet);