Я пишу дружественный к GC код, чтобы читать и возвращать пользователю серию сообщений byte[]
. Внутри я повторно использую тот жеByteBuffer
что означает, что я буду неоднократно возвращать один и тот же byte[]
экземпляр большую часть времени .
Я подумываю написать предостерегающий javadoc и представить его пользователю какIterator
. Насколько я знаю, это не нарушит контракт Iterator
, но пользователь наверняка удивится, если нарушитLists.newArrayList(myIterator)
и получите обратно List
, заполненный одним и тем же byte[]
в каждой позиции!
Вопрос :является ли плохой практикой для класса, который может мутировать и возвращать один и тот же объект для реализации интерфейса Iterator
?
Если да, то какова лучшая альтернатива? «Не видоизменяйте/не используйте повторно свои объекты» — простой ответ. Но это не касается случаев, когда повторное использование очень желательно.
Если нет, то как вы оправдываете нарушение принципа наименьшего удивления ?
Две второстепенные ноты:
Я использую ГуавуAbstractIterator
так что удалить ()на самом деле не стоит.
В моем случае пользователь — это я , и видимость этого класса будет ограничена, но я попытался задать этот вопрос достаточно широко, чтобы применить его в более широком смысле.
Обновление:Я принимаю ответ Луи, потому что у него в 3 раза больше голосов, чем у Кейта, но обратите внимание, что в моем случае использования я планирую использовать код, который я оставил в комментарии к ответу Кейта для производства.