Wiele osób nie lubi tworzyć własnych specyficznych dla domeny typów, które nie niosą ze sobą wartości biznesowej. Przykładowo po co tworzyć własny typ reprezentujący wiek skoro można oprzeć się o starego dobrego inta?
Z moich obserwacji wynika, że przyczyna tego zachowania leży w niechęci do pisania jakiegokolwiek dodatkowego kodu, czyli zazwyczaj testów. Zamiast tego dzielnie napieramy na dodatkowy kod przy okazji różnorodnych funkcjonalności biznesowych. Wiek to jest zresztą piękny przykład, bo za każdym razem nasze testy będą jakoś zahaczać o wartości ujemne, nulle itp. Czy nie lepiej jest napisać to raz, a porządnie?
Listing 1. Przykładowa klasa Age
class Age { @Min(0) @Max(Integer.MAX_VALUE) @NotNull private Integer value; public Age() { } public Age(Integer value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } // hash, equals, toString co tam trzeba }
Do tego dopisac konwertery na potrzeby Hibernate-a i gotowe. czy to tak dużo roboty?
Dziwi mnie ta niechęć do wzorca Value Object i jednej z Ekstremalna obiektowość w praktyce – część 3 – Opakowuj wszystkie prymitywy i Stringi. Nie dużo z tym roboty, a życie łatwiejsze.
A po co Ci publiczny konstruktor bezargumentowy? Przecież to umożliwia utworzenie obiektu w stanie niespójnym – bez wieku.
Ponieważ np. Jackson wymaga 🙁 to jest też dość duża wada otoczenia w jakim tworzymy kod, że czasami potrzebne są rzeczy złe.
Dlaczego założyłeś @NotNull dla typu prostego?
Poprawione 🙂
Jackson akurat nie wymaga, jest @JsonCreator. Własny typ Hibernate chyba też poradzi sobie bez tego konstruktora.