Даже в очень аккуратном Java API иногда прячется ошибка, которая сначала выглядит как мелочь, а потом превращается в источник очень дорогих проблем. Особенно неприятно, когда всё начинается с безобидного
getXXX(), который вроде бы просто геттер, отдающий данные наружу.Но проблема в том, что в этот момент наружу может утекать изменяемое внутреннее состояние объекта. А значит, ломается инкапсуляция, начинают нарушаться инварианты, а баги в таких местах потом дебажатся мучительно долго. Для библиотек и платформенного кода это ещё опаснее: однажды такой API становится публичным контрактом, и цена ошибки вырастает в разы.
И самое неприятное, что на этом история не заканчивается: подобные решения иногда расширяют attack surface системы и в плохом сценарии становятся частью куда более серьёзных инцидентов. В новой статье разбираю именно такой случай на простом Java-примере и показываю, почему эта ошибка в дизайне API может стоить очень дорого. Если вам близки темы Java, Spring и аккуратного API-дизайна, почитайте, статья небольшая 😉
📎 Читать на Хабр:
https://habr.com/ru/companies/spring_aio/articles/1046620/
