Um Iterator que sofre mutação e retorna o mesmo objeto. Mau prática?
Estou escrevendo código amigável do GC para ler e retornar ao usuário uma série debyte[]
mensagens. Internamente eu reutilizo o mesmoByteBuffer
o que significa que vou repetidamente retornar o mesmobyte[]
instânciaa maior parte do tempo.
Estou pensando em escrever um javadoc e expor isso ao usuário como umIterator<byte[]>
. AFAIK não vai violar oIterator
contrato, mas o usuário certamente poderia se surpreender se eles fizeremLists.newArrayList(myIterator)
e volte umList
preenchido com o mesmobyte[]
em cada posição!
A pergunta: é issomá prática para uma aula quepode sofrer mutação e retornar o mesmo objeto para implementar oIterator
interface?
Se sim, qual a melhor alternativa? "Não mude / reutilize seus objetos" é uma resposta fácil. Mas não aborda os casos em que a reutilização é muito desejável.
Se não, como você justifica a violação doprincípio de menos espanto?
Duas notas menores:
Estou usando goiabaAbstractIterator
então remove () não é realmente preocupante.
No meu caso de uso, o usuário émim e a visibilidade dessa classe será limitada, mas tentei perguntar isso em geral o suficiente para aplicar de forma mais ampla.
Atualizar: Estou aceitando a resposta de Louis porque ela tem 3x mais votos do que a de Keith, mas observe que no meu caso de uso estou planejando tomar o código que deixei em um comentário sobre a resposta de Keith à produção.