Korzyści ze stosowania statycznej wewnętrznej klasy konstruktora

9

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?

Nim Chimpsky
źródło
Zobacz także stackoverflow.com/a/1953567/632951
Pacerier

Odpowiedzi:

8

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ć :-)

Martijn Verburg
źródło
1
To nie mówi nic o tym, dlaczego wnętrze powinno być statyczne ...
Jimmy Hoffa
Celem jest również niezmienność i brak skutków ubocznych.
Martijn Verburg
6

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.

pdr
źródło
Nie sądzę, że wzorzec konstruktora ma coś wspólnego ze zmiennością, nawet przykład gof na wiki jest zmienny ... pl.wikipedia.org/wiki/Builder_pattern#Java również, wzorzec ma zalety, które opisałem w pytaniu.
NimChimpsky
3
@NimChimpsky: Nie ma wątpliwości, czy wzorzec Konstruktora można zastosować do utworzenia obiektu zmiennego. Pytanie brzmi: powinieneś? Gettery i setery są już od zawsze, gdzie obiekty mogą być modyfikowalne, są doskonale solidnym rozwiązaniem, ale ludzie napotkali wspólny problem z tworzeniem niezmiennych obiektów: niemożliwych do zarządzania łańcuchów konstruktorów. Konstruktor był powszechnym rozwiązaniem, dlatego stał się wzorem ułatwiającym komunikację.
pdr