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

标签 java collections design-patterns

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

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

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

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/

相关文章:

java - 什么时候应该使用范围注释

java - 循环使圆变大

c# - 独特的对集合

objective-c - Cocoa Touch 中常见的设计模式有哪些?

Action 监听器监听事件后,Java gui 不打印

java - 如何添加命令权限?

Java - 匹配两个无序列表

java - 如何使用 HashMap 查找字符串数组的重复条目并使它们为空

php - 如何在 PHP 中实现 MVC

java - 如何修复客户端代码以便通过组合实现代码重用?