The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Итератор - это один из основных интерфейсов Java, введенный в Java 1.2. Он должен быть очень простым; однако, по моему опыту, многие Java-разработчики не понимают, как реализовать пользовательский итератор, который должен перебирать поток данных, поступающих из другого источника. Другими словами, он становится адаптером другого источника данных в виде итератора. Я надеюсь, что этот пример поможет.
Предположим, у нас есть объект этого класса:
Когда мы вызываем read()
, он возвращает новый массив байтов, которые были получены откуда-то. Если нечего извлекать, массив будет пустым. Теперь мы хотим создать адаптер, который бы потреблял эти байты и позволял нам их перебирать.
Вот как это должно выглядеть (это не является потокобезопасным!).
Нет способа сделать его потокобезопасным, потому что процесс итерации находится вне области итератора. Даже если мы объявим наши методы как synchronized
, это не гарантирует, что два потока не будут конфликтовать, когда они оба вызывают hasNext()
и next()
. Так что не беспокойтесь об этом и просто документируйте итератор как не потокобезопасный, а затем позвольте его пользователям синхронизировать на более высоком уровне, когда это необходимо.
Translated by ChatGPT gpt-3.5-turbo/42 on 2024-01-09 at 18:12