Обратите внимание, что исключение UnsupportedOperationException допустимо только из-за особого свойства платформы Java Collections Framework, в котором реализациям разрешается "обманывать" реализацию части интерфейса, поскольку они неизменны.
Так что это нормально для метода put () (при условии, что все методы-мутаторы делают одно и то же), но карта, которая выбрасывает UnsupportedOperationException из метода size (), будет просто повреждена. Если вы пытаетесь реализовать карту, которая не знает, насколько она велика, у вас могут быть проблемы (хотя иногда вы можете вернуть Integer.MAX_VALUE).
Также обратите внимание, что в документации класса для UnsupportedOperationException говорится, что она является частью Java Collections Framework. Вне рамок коллекций исключение UnsupportedOperationException не ожидается и может привести к тому, что клиентский код просто не будет работать. Конечно, это RuntimeException, но только то, что вы можете выбросить его, не означает, что ваш метод будет работать, если он всегда работает.
Вместо этого вы можете либо реорганизовать интерфейс (возможно, разделив его на две части), либо переосмыслить, почему этот класс претендует на звание Foo, если он явно не так, поскольку он не может делать то, для чего определен Foos быть в состоянии сделать.