В том то и дело, что эти статические методы превращают VO в сервис, они парсят и рассчитывают данные и лишь потом создают VO. Фактически эту логику вообще нужно выносить за пределы класса.
Она не превращает в сервис, эта логика статична. По твоему мнению, я так полагаю, любая логика превращает объект в сервис? Зачем её нужно выносить, если она гармонично смотрится с самим объектом? Так сказать highly cohesive.
Так строка со временем принимает на ВХОД и парсится внутри по определённым параметрам, которые жёстко описаны ВНУТРИ. Какой вывод?
Не имеет значения, вход или выход, это детали представления. У нас есть какой-то внутренний DSL, в котором мы имеем право выбрать удобный формат для описания бизнес-логики. Если же требуется, чтобы при взаимодействии с клиентом (данные нам от него или от нас ему — не суть) мы использовали другой формат — без проблем, сконвертируй, отформатируй как тебе нужно. По той же самой причине мы не экранируем HTML перед записью в БД: HTML-экранирование — это деталь конкретного формата, пусть там и остаётся, нам на это пофиг.
Классический пример VO — это DateTime. Но без учёта системных часов, нужно представить, что мы не используем «now». Там много логики и она достаточно сложная, но она статична и григорианский календарь он и в Африке григорианский. DateTime можно создавать разными способами: через timestamp, через явное указание даты или даты/времени и т.д.
В Java 8, например, учли ошибки прошлого и сделали очень приятный immutable API для работы с датой/временем:
http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
Domain-driven design. The new API models its domain very precisely with classes that represent different use cases for Date and Time closely.
Там куча различных способов получения объекта:
LocalDate.of(2012, Month.DECEMBER, 12); // from values
LocalDate.ofEpochDay(150); // middle of 1970
LocalTime.of(17, 18); // the train I took home today
LocalTime.parse("10:15:30"); // From a String
— это и есть статические конструкторы, о которых мы говорим.
Но я уверен, что статические методы вкупе с финализацией это ацкий гавнокод, который на порядок усложняет поддержку проекта.
Какой-то религией попахивает, давай факты. А чем плох final в данном случае?
Я привёл примеры изменений на проекте к которым не готов этот кусок кода, без переписывания или декорирования.
По-моему, я от тебя не видел ещё ни одного примера. Когда это ты успел их привести? Я тебя спрашивал, но ты тупо игнорил мои вопросы, потому что тебе не нужно разбираться в проблеме, у тебя уже есть религия, тебе больше ничего не нужно.