java – 一个变换并返回相同对象的迭代器.糟糕的做法?

前端之家收集整理的这篇文章主要介绍了java – 一个变换并返回相同对象的迭代器.糟糕的做法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了GC友好的代码来读取并返回给用户一系列的byte []消息.在内部我重复使用相同的 ByteBuffer这意味着我将在大多数时候重复返回相同的字节[]实例.

我正在考虑写一个警告性的javadoc并将其暴露给用户作为Iterator<byte[]>.AFAIK它不会违反Iterator的合同,但是用户肯定会惊讶,如果他们做了Lists.newArrayList(myIterator),并得到一个列表填充相同的字节[]在每个位置!

问题是:对于可能会变异并返回相同对象来实现Iterator接口的类,它是不好的做法吗?

>如果是这样,最好的选择是什么? “不要变异/重复使用你的对象”是一个简单的答案.但是,在重用是非常可取的情况下,并没有解决这种情况.
>如果没有,你如何证明违反principle of least astonishment的理由?

两个小笔记:

>我正在使用Guava的AbstractIterator,所以remove()不是真的很关心.
>在我的用例中,用户是我,这个类的可见性将是有限的,但是我已经试图通过这个问题来广泛地应用.

更新:我接受路易斯的答案,因为它比基思的票数多3倍,但请注意,在我的用例中,我打算采取我留下的代码,对基思​​的生产答案.

解决方法

EnumMap在其entrySet()迭代器中基本上完全是这样,这导致了令人困惑,疯狂,令人沮丧的错误.

如果我是你,我不会使用迭代器 – 我会写一个不同的API(甚至可能与迭代器完全不同),并实现它.例如,您可以编写一个新的API,作为输入的ByteBuffer将消息写入,因此API的用户可以控制缓冲区是否被重用.这似乎是相当直观的(用户可以编写明显地干净地重用ByteBuffer的代码),而不会产生不必要的杂乱的代码.

原文链接:https://www.f2er.com/java/122877.html

猜你在找的Java相关文章