为什么最终的收藏仍然会更新?

Odd*_*Dev 0 java collections final

我有这个代码,我存储两个集合,然后添加一个事件监听器(这里没有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);

        }

    });
Run Code Online (Sandbox Code Playgroud)

我最初调试了这个,并正确设置了集合.它不包含任何对象,因为代码刚刚初始化.

调试监听器(由于选择了项目而触发了事件)让我感到困惑.布尔debug1debug2都是真的,因为收集selectedItemsunselectedItems根据项目选择更新.因此,事件源集合包含与声明的最终集合(selectedItems,unselectedItems)相同的项目.

这两个宣布的最终收藏品是否必须保持不变?

mon*_*tix 6

final只是意味着final无法更改已声明的变量,并且final无法继承该类.所有非原始变量都是Java中的引用,这意味着它们"指向"或引用对象的实例,但它们本身不是对象.

你所指的是一个不可变对象,它是一个final class所有字段都是final并且private没有setter 的实例.

希望这有助于澄清.