为什么最终 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,因为代码刚刚初始化。
调试侦听器(事件被触发是因为进行了项目选择)让我感到困惑。布尔值 debug1
和 debug2
都为真,因为 collection selectedItems
和 unselectedItems
根据项目选择进行了更新。因此,事件源 collection 包含与声明的最终 collections(selectedItems
、unselectedItems
)相同的项目。
声明的两个最终 collection 不必保持原样吗?
final
简单的说,一个声明为 final
的变量不能被改变,而 class 即 final
不能被继承。
所有非原始变量都是 Java 中的引用,这意味着它们 'point' 或引用对象的实例,但它们本身不是对象。
你指的是不可变对象,它是一个 final class
的实例,它的所有字段都是 final
和 private
并且没有设置器。
希望这有助于澄清。
使用final
仅意味着不能将引用更改为指向另一个对象,而不是其内容是否可以更新。
如果您想要一个不可修改的集合,请使用 Collections.unmodifiableSet(yourSet);
我在这段代码中存储了两个 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,因为代码刚刚初始化。
调试侦听器(事件被触发是因为进行了项目选择)让我感到困惑。布尔值 debug1
和 debug2
都为真,因为 collection selectedItems
和 unselectedItems
根据项目选择进行了更新。因此,事件源 collection 包含与声明的最终 collections(selectedItems
、unselectedItems
)相同的项目。
声明的两个最终 collection 不必保持原样吗?
final
简单的说,一个声明为 final
的变量不能被改变,而 class 即 final
不能被继承。
所有非原始变量都是 Java 中的引用,这意味着它们 'point' 或引用对象的实例,但它们本身不是对象。
你指的是不可变对象,它是一个 final class
的实例,它的所有字段都是 final
和 private
并且没有设置器。
希望这有助于澄清。
使用final
仅意味着不能将引用更改为指向另一个对象,而不是其内容是否可以更新。
如果您想要一个不可修改的集合,请使用 Collections.unmodifiableSet(yourSet);