加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:20:33 所属栏目:Java 来源:网络整理
导读:我写了GC友好的代码来读取并返回给用户一系列的byte []消息.在内部我重复使用相同的 ByteBuffer 这意味着我将在大多数时候重复返回相同的字节[]实例. 我正在考虑写一个警告性的javadoc并将其暴露给用户作为 Iteratorbyte[] .AFAIK它不会违反Iterator的合同,
我写了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的代码),而不会产生不必要的杂乱的代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读