Я предпочитаю второй, так как реализованные интерфейсы дают вам тип независимо от фактического типа объекта и гарантируют ряд доступных методов («контракт», определенный интерфейсом).
Как правило, не устанавливайте метод boolean hasXX()
для свойств, принимаемых пользователем, как обычно, вы должны проверить if (Y.getX() != null)
, чтобы проверить, установлено ли свойство или имеет какое-либо значение.