Стало немного лучше. Но, как вы правильно заметили, все равно есть дыры.

Теперь надо объявить in и out как final и передавать их как аргументы конструктора.
Также надо убрать метод ```getCommands()``` - он отдает команды наружу, и с ними можно сделать все, что угодно.

Останется только меняющий состояние метод ```add()```. С ним жить уже не так страшно. Теперь никто* не в силах сломать вам стейт.