可能的答案是“从不”或“视情况而定”。
就我个人而言,我会说,视情况而定。
以下用法会使集合(对我而言)看起来是享元:
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 static 和 unmodifiableList 的其他明显情况 未使用,将不会被视为享元。
我错过了什么吗?
我必须考虑 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/