如何重用使用相同支持迭代器的集合?

时间:2014-08-11 03:21:45

标签: java collections iterator guava

我对Java很新,所以我的知识非常有限。我正在开发一个个人项目,我正在尝试使用Guava中用于创建集合视图/转换的一些技术。我创建了一个名为View的类,将输入的集合作为后台迭代和转换,然后将其呈现为只读的可迭代。 (不是一个集合,虽然我不认为它对这个问题有很大的不同)。这是一个使用它的简单例子......

public class Node {
  public enum Change implements Function<Node, Coordinate> {
    TO_COORDINATE;
    @Override public Coordinate apply(Node node) {
      return new Coordinate(node);
    }
  }

  private HashSet<Node> neighborNodes = new HashSet<Node>();
  //various other members

  public View<Coordinate> viewNeighborCoordinates() {
    return new View<Coordinate>(neighborNodes, Change.TO_COORDINATE);
  }
}

现在如果某个方法想要使用此节点的viewNeighborCoordinates(),然后一些其他方法也想要查看此节点的viewNeighborCoordinates(),那么总是返回新对象似乎很浪费,对吧?我的意思是,任何数量的东西都应该能够与同一个转换共享同一个支持的视图的引用,因为它们所做的就是读取它。是否存在管理共享对象池的既定方法,可以像字符串一样“实习”?是否只需制作某种ViewFactory来存储正在使用的运行视图列表,并且每当有人想要一个视图时,它会检查它是否已经拥有该视图并将其交付出来? (那更有效率)?

1 个答案:

答案 0 :(得分:1)

如前所述,实习是可能的(看Interners),但最有可能是一个坏主意。

另一种可能性是存储View的字段的延迟初始化。由于我也很懒,我只指向一个Lombok实现。如果你想试试这个,请注意DCL。如果您的类是不可变的,您可能根本不需要同步,例如String.hashCode

一种非常简单的可能性是急切地初始化字段。假设您经常需要视图,这是最好的方式。

但不知道更多,您当前的实施是最好的。请注意root of all evil

如果没有分析或基准测试,请不进行优化(如果您进行基准测试,那么请正确使用caliperjmh。使用Java进行自制基准测试不起作用。