Podczas pisania wytycznych do kodu dla firmy zaleciłem użycie wzorca Builder z Effective Java zamiast konstruktorów teleskopowych.
Jednak po zastanowieniu się nad tym nieco bardziej eleganckim rozwiązaniem z pewnością jest po prostu usunięcie klasy konstruktora, a także usunięcie dodatkowych konstruktorów z opcjonalnymi argumentami.
Wystarczy więc mieć jednego konstruktora z wymaganymi parametrami, normalnymi modułami pobierającymi / ustawiającymi i komentować kod. Podczas implementacji wystarczy utworzyć nową instancję obiektu yr, a następnie ustawić wartości.
Moje pierwotne myślenie polegało na usunięciu nieporozumień dotyczących tego, które parametry były opcjonalne i jakie były wymagane; jednak prawdziwa korzyść wynika z zastosowania metody łączenia łańcuchów / płynnego interfejsu.
Wzorzec konstruktora ma zalety, gdy tworzysz wiele nowych instancji, ponieważ ide może wykonywać pracę nóg, a także, jeśli istnieje wiele (15+) parametrów opcjonalnych. Czy jednak warto poświęcić dodatkowy czas na kodowanie statycznej klasy wewnętrznej, czy zaleciłbyś użycie konstruktora, czy to strata czasu?
Odpowiedzi:
Zwykle podążam za wzorcem, że konstruktory powinny podawać wszystkie obowiązkowe wartości wymagane do stworzenia prawidłowego i spójnego obiektu. W przypadku wartości opcjonalnych staram się zastanowić, jakie powinny być najczęściej używane wartości domyślne, aby settery były używane w jak najmniejszym stopniu.
Jeśli stwierdzę, że istnieje wiele wartości opcjonalnych lub że większa część wartości opcjonalnych jest zwykle zmieniana w stosunku do wartości domyślnych, użyję wzorca konstruktora (statyczny konstruktor wewnętrzny lub inny podobny projekt).
Josh ogólnie daje dobrą radę - najlepszą rzeczą, którą lubię w nim, jest to, że rada pochodzi z okopów - przyznaje się, że popełnił błędy w projektowaniu części Javy, a Skuteczna Jawa jest po części swego rodzaju „lekarstwem”, aby mówić :-)
źródło
Wzorzec konstruktora Josha Blocha, podobnie jak wzorzec konstruktora GoF, oferuje sposób tworzenia niezmiennego obiektu z dużą ilością domyślnych danych bez długich list powiązanych konstruktorów.
Jeśli „masz jednego konstruktora z wymaganymi parametrami, normalnymi obiektami pobierającymi / ustawiającymi”, wówczas twój obiekt nie jest już niezmienny. to znaczy. Możesz to zmienić długo po jego utworzeniu.
Jeśli nie jest to dla ciebie problemem, to nigdy nie potrzebujesz wzorca Konstruktora. Jeśli jest to problem, twoje rozwiązanie jest wadliwe.
źródło