Tengo problemas con Iterator.remove() invocado en un HashSet.HashSet.remove() y Iterator.remove() no funcionan
Tengo un conjunto de objetos marcados con el tiempo. Antes de agregar un nuevo elemento al conjunto, recorro el conjunto, identifico una versión anterior de ese objeto de datos y lo elimino (antes de agregar el nuevo objeto). la marca de tiempo está incluida en hashCode y es igual a(), pero no es igual aData().
for (Iterator<DataResult> i = allResults.iterator(); i.hasNext();)
{
DataResult oldData = i.next();
if (data.equalsData(oldData))
{
i.remove();
break;
}
}
allResults.add(data)
Lo curioso es que i.remove() falla en silencio (sin excepción) para algunos de los elementos del conjunto. He verificado
La línea i.remove() se llama en realidad. Puedo llamarlo desde el depurador directamente en el punto de interrupción en Eclipse y todavía no se puede cambiar el estado de Set
DataResult es un objeto inmutable por lo que no puede haber cambiado después de haber sido agregado originalmente al conjunto.
Los métodos equals y hashCode() usan @Override para garantizar que sean los métodos correctos. Las pruebas unitarias verifican este trabajo.
Esto también falla si solo uso una instrucción for y Set.remove en su lugar. (por ejemplo, recorrer los elementos, encontrar el elemento en la lista, luego llamar a Set.remove (oldData) después del bucle).
He probado en el JDK 5 y JDK 6.
pensé que debe estar pasando algo básico, pero después de pasar un tiempo considerable en esta mi colega y yo está confundido. ¿Alguna sugerencia de cosas para verificar?
EDIT:
Ha habido preguntas - es DataResult verdad inmutable. Sí. No hay setters Y cuando se recupera el objeto Date (que es un objeto mutable), se hace creando una copia.
public Date getEntryTime()
{
return DateUtil.copyDate(entryTime);
}
public static Date copyDate(Date date)
{
return (date == null) ? null : new Date(date.getTime());
}
hacer otras modificaciones (un poco más tarde): Para el registro - DataResult no era inmutable! Hacía referencia a un objeto que tenía un código hash que cambiaba cuando se conservaba en la base de datos (mala práctica, lo sé). Resultó que si se creaba un DataResult con un subobjeto transitorio, y el subobjeto se conservaba, se cambiaba el hashcode DataResult.
Muy sutil: miré esto muchas veces y no noté la falta de inmutabilidad.
Dos posibilidades. 1. Usted dice que DataResult es inmutable. ¿Es seguro asumir que el constructor establece los valores y no hay ningún método establecido? 2. Tus iguales y hashcode no funcionan como esperabas. ¿Puedes publicar el código para esos dos? –