Opóźnienie / opóźnienie? W tej sprawie nazywam BS. Z tej praktyki powinno być dokładnie zero. ( Edycja: W komentarzach zaznaczono, że może to w rzeczywistości hamować optymalizacje wykonywane przez maszynę wirtualną HotSpot. Nie wiem wystarczająco dużo o implementacji maszyny wirtualnej, aby to potwierdzić lub zaprzeczyć. Opierałem swój komentarz na C ++ implementacja funkcji wirtualnych).
Istnieje pewien narzut kodu. Musisz utworzyć wszystkie konstruktory z pożądanej klasy podstawowej, przekazując ich parametry.
Nie postrzegam tego też jako anty-wzoru. Uważam to jednak za straconą okazję. Zamiast tworzyć klasę, która wyprowadza klasę podstawową tylko ze względu na zmianę nazwy, może zamiast tego stworzysz klasę, która zawiera kolekcję i oferuje ulepszony interfejs dla poszczególnych przypadków? Czy pamięć podręczna widgetów naprawdę powinna oferować pełny interfejs mapy? A może powinien oferować wyspecjalizowany interfejs?
Ponadto w przypadku kolekcji wzorzec po prostu nie działa razem z ogólną zasadą używania interfejsów, a nie implementacji - to znaczy, że w zwykłym kodzie kolekcji należy utworzyć HashMap<String, Widget>
a następnie przypisać ją do zmiennej typu Map<String, Widget>
. Twoja WidgetCache
puszka nie przedłużać Map<String, Widget>
, bo to interfejs. Nie może być interfejsem rozszerzającym interfejs podstawowy, ponieważ HashMap<String, Widget>
nie implementuje tego interfejsu, podobnie jak żadna inna standardowa kolekcja. I chociaż możesz uczynić go klasą rozszerzającą się HashMap<String, Widget>
, musisz następnie zadeklarować zmienne jako WidgetCache
lub Map<String, Widget>
, a pierwsza utraci elastyczność zastępowania innej kolekcji (być może kolekcji leniwego ładowania ORM), podczas gdy drugi rodzaj pokona punkt posiadania klasy.
Niektóre z tych kontrapunktów dotyczą także mojej zaproponowanej klasy specjalistycznej.
To są wszystkie kwestie do rozważenia. Może to być właściwy wybór. W obu przypadkach argumenty oferowane przez twojego kolegę są nieważne. Jeśli myśli, że to anty-wzór, powinien to nazwać.