Optional.ofNullable не различает отсутствующий узел и существующий узел со значением null: оба случая дадут Optional.empty(). Это ограничение выбранного контракта, не списка.
Обработка возможных null‑значений в методе get связного списка
Optional.ofNullable не различает отсутствующий узел и существующий узел со значением null: оба случая дадут Optional.empty(). Это ограничение выбранного контракта, не списка.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо прояснить, как должен вести себя метод get, когда сохраняемое в узле значение может быть null. Требуется выяснить, допускается ли наличие одной или нескольких таких нод и как это отражается на возвращаемом результате.
@Override
public Optional<T> get(int targetIdx) {
// установить позицию = 0
// проходить по цепочке пока next не будет == null
int pos = 0;
for (int i = 0; i < targetIdx; i++) {
if (pos == targetIdx) {
return Optional.ofNullable(item);
}
pos++;
}
return Optional.empty();
}
Ответ
Optional.ofNullable не различает отсутствующий узел и существующий узел со значением null: оба случая дадут Optional.empty(). Это ограничение выбранного контракта, не списка.
Нужно выбрать политику: запретить null при add, возвращать отдельный результат с признаками found/value либо получать узел, а не Optional его значения. Несколько null-узлов технически допустимы, если коллекция их разрешает. Показанный get также неверен: он не переходит по next, проверка pos == targetIdx внутри данного цикла не достигается, а индекс 0 сразу даёт empty. Корректный обход начинает с head и выполняет targetIdx переходов, проверяя существование текущего узла.