gpt4 book ai didi

java - 从 Iterator 返回相同的对象

转载 作者:行者123 更新时间:2023-11-29 09:07:07 25 4
gpt4 key购买 nike

<分区>

它是否有效 - 即,在联系中,Iterator 返回与先前迭代相同的(可变)对象,或具有共享可变状态的新对象作为先前对象?也就是说,是否可以调用 next() 来使先前调用返回的对象无效(只要有记录)?

我完全理解这不是一个好主意一般,我也没有养成这样的习惯。

但是,在某些情况下,重用相同的底层对象或具有共享内部结构的新对象(因此可能会使先前返回的对象的内部结构无效)在某些情况下具有重要且可衡量的意义。一个很好的例子是,当从迭代器返回的对象以一定的偏移量和长度指向包含 Iterable 的缓冲区数组时,当检索到后续对象时,该数组可能会被覆盖。

虽然这违反了最小惊讶原则,并且可能对客户不友好 - 但我很好奇它是否违反了 Iterator 的联系 - 只要我记录它,我是否在玩规则?

javadoc似乎是针对集合编写的,在 next() 调用之间共享状态可能毫无意义,但是 Iterator 是一个通用接口(interface)(您可以在没有支持集合,甚至没有支持 任何东西)。

基本上,我正在尝试实现一些在性能方面与享元模式相当的东西,但要保留 Java 迭代器的优点。

遵循这种模式的迭代器可以安全地以下列方式使用:

for (Foo foo : FooIterable) {
if (foo.method()) {
System.println("ha!");
}
}

因为 foo 的每个实例都不会从一次迭代逃逸到另一次迭代。但是,像下面这样的东西通常不起作用:

List<Foo> allTheFoos = ...;
for (Foo foo : FooIterable) {
allTheFoos.add(foo);
}

for (Foo foo : allTheFoos) {
...
}

由于第一个循环中的 foo 被存储起来并因此逃避了它们的迭代。当您稍后访问它们时,它们的状态可能无效(例如,它们可能看起来都像从初始迭代返回的最后一个 foo

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com