Gab*_*e B 0 java collections decorator generic-collections guava
我遇到了一个非常讨厌的我会说'副作用',但这显然是一个糟糕的设计问题.我正在使用Guava ForwardingList模式来装饰常规List.我的目的是建立一个大小限制列表,当满足maximumSize时,最旧的元素被踢出(简单的FIFO设计).请注意,我不会代理或克隆我现有的集合.但我有这个非常讨厌的副作用:
List<String> originalList = new ArrayList<String>();
int maximumSize = 2;
originalList.add("foo");
originalList.add("bar");
System.out.println(originalList); // [foo, bar]
ListFactory<String> factory = ListFactory.getInstance(String.class);
List<String> decoratedList = factory.newTalendList(originalList, maximumSize);
decoratedList.add("beer");
System.out.println(originalList); // [bar, beer]
originalList.add("ben");
System.out.println(originalList); // [bar, beer, ben] <-- !!!
System.out.println(decoratedList); // [bar, beer, ben] <-- !!!
Run Code Online (Sandbox Code Playgroud)
(注意:我的装饰类会覆盖add()以在添加新元素时删除列表的第一个元素.包含toString()的所有其他非重写方法都被委托给原始List
好吧,你可能会看到我是否使用原始的add()方法添加一个元素,我可以超过maximumsize ...好吧,我想这是不可避免的(毕竟设计并没有错).但这不是为decorList设计的.
我找到的唯一解决方法是:
List<String> decoratedList = factory.newTalendList(new ArrayList<String>(originalList), maximumSize);
Run Code Online (Sandbox Code Playgroud)
但它似乎并不是最好的方式(我不确定它是否适用于所有环境):我不是在装饰 originalList,而是她的匿名克隆!我想知道:也许我完全搞砸了我的设计?有没有更好的方法来构建它?
这种模式运作的唯一方法是originalList
在创建装饰器后再也不会再次引用.在ForwardingList
不可能有超过在发生什么任何控制originalList
.(没有装饰者可以.)
你应该很可能做的,总体而言,是创建一个返回全新的装修清单工厂方法,绝不可以让你在所有访问原始列表.
归档时间: |
|
查看次数: |
192 次 |
最近记录: |