簡體   English   中英

如何重用將使用相同后備迭代器的集合?

[英]How can I reuse collections that would use the same backing iterator?

我是Java的新手,所以我的知識非常有限。 我正在一個個人項目中,嘗試使用番石榴中用於創建集合的視圖/轉換的一些技術。 我創建了一個名為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來存儲正在使用的視圖的運行列表,並且每當有人想要一個視圖時,它都會檢查是否已經擁有該視圖並將其分發出去? (效率更高)嗎?

如前所述,可以進行實習(請參閱Interners ),但很可能不是一個好主意。

另一種可能性是存儲View的字段的延遲初始化。 由於我也很懶,因此我只為您提供Lombok實現。 如果要嘗試此操作,請小心使用DCL 如果您的類是不可變的,則可能根本不需要同步,例如String.hashCode

一個非常簡單的可能性是渴望初始化一個字段。 假設您經常需要視圖,那是最好的方法。

但是,如果不了解更多信息,那么當前的實現是最好的。 當心一切邪惡根源

不要在沒有概要分析或基准測試的情況下進行優化(如果您進行基准測試,則可以正確地進行操作,即使用caliperjmh。Java中的自制基准測試不起作用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM