While debugging a custom iterator today to find the source of a logical
error, I discovered something an iterator developer may not expect.  The
getTopValue() of RFile returns a reference to the RFile's internal Value
private variable.  The private variable is modified inside RFile via


val.readFields(currBlock);


which means that if an iterator stores the reference from getTopValue(),
that is, without copying the Value to a new Object, then the value will be
updated in the iterator when the RFile's next() method is called.

Here is an example snippet to demonstrate:

Value v1 = source.getTopValue();

source.next();                                   // v1 is modified!


The following code would not have a problem:

Value v1 = new Value(source.getTopValue());

source.next();


I bet this is done for performance reasons.  Is this expected?

Regards, Dylan

Reply via email to