gpt4 book ai didi

Java:Collections.unmodifiableXYZ(...) 在特殊情况下是否使集合对象成为享元?

转载 作者:行者123 更新时间:2023-11-29 08:19:52 24 4
gpt4 key购买 nike

可能的答案是“从不”“视情况而定”

就我个人而言,我会说,视情况而定

以下用法会使集合(对我而言)看起来是享元:

public final static List<Integer> SOME_LIST = 
Collections.unmodifiableList(
new LinkedList<Integer>(){ // scope begins
{
add(1);
add(2);
add(3);
}
} // scope ends
);

对吧?你不能永远改变它,因为唯一的地方“原始”集合对象是已知的(可以被改变),是unmodifiableList 的参数列表中的作用域,立即结束。

第二件事是:当你从列表中检索一个元素时,它是一个Integer 本身 是享元。

final staticunmodifiableList 的其他明显情况未使用,将不会被视为享元。

我错过了什么吗?
我必须考虑 LinkedList 的一些内部方面吗?妥协享元?

最佳答案

我想你指的是 flyweight pattern.这种模式的基本思想是你正在处理其实例可以重用的复杂对象,并用它的方法给出不同的表示。

要使这样的对象正常工作,它应该是不可变的。

按照您描述的方式创建列表时,明确给出了不变性。但是由于没有 SOME_LISt 操作的外部对象/参数,我不会将其称为享元模式的示例。

享元模式的另一个典型属性是此类对象的“驻留”。当只创建一个对象的单个实例时,这是没有意义的。

如果你经常处理从一个对象传递到另一个对象的列表,并且你想确保不可变性,更好的选择可能是使用 Google-Collections .

final static ImmutableList<Integer> someList = ImmutableList.of(1, 2, 3);

当然也可以使用构建器构建更复杂的不可变对象(immutable对象)。

这会创建一个不可变列表的实例。它仍然会实现 List 接口(interface),但会拒绝执行任何 add()、addAll()、set()、remove() 操作。

因此您仍然可以在需要 List 接口(interface)时将其传递给方法,但要确保其内容未被更改。

关于Java:Collections.unmodifiableXYZ(...) 在特殊情况下是否使集合对象成为享元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com