Powiedzmy mam dwóch konstruktorów w klasie:Java - Jak radzić sobie z wymazywaniem typów w konstruktorach?
public User (List<Source1> source){
...
}
public User (List<Source2> source) {
...
}
powiedzmy, że oba te konstruktorów te same informacje o użytkowniku i są równie ważne sposoby skonstruować użytkownika dla różnych zastosowań.
W Javie nie można tego zrobić z powodu usunięcia typu - Java nie zaakceptuje dwóch konstruktorów, które mają jako parametry Listę <? >.
A więc, jak to obejść? Co to jest rozwiązanie, które nie jest przesadą, ale nadal respektuje podstawowe OO? Wydaje się błędne, aby skonstruować metodę fabryczną lub inny interfejs wokół tego tylko dlatego, że Java nie ma silnej obsługi generycznych.
Oto możliwości mogę myśleć:
1) zaakceptować List<?>
jako parametr do konstruktora i analizować w konstruktorze, jaki rodzaj logiki trzeba, czy wyjątek, jeśli nie jest którykolwiek z akceptowane typy.
2) Utwórz klasę, która akceptuje obie listy, konstruuje odpowiedni obiekt użytkownika i zwraca go.
3) Utwórz owijki wokół List<Source1>
i List<Source2>
, które można zamiast tego przekazać do konstruktora użytkownika.
4) Podklasa tego faceta z dwiema klasami, w którym cała funkcjonalność jest dziedziczona z wyjątkiem konstruktora. Konstruktor jednego akceptuje Source1, drugi akceptuje Source2.
5) Owiń tego faceta z budowniczym, gdzie są dwie różne metody budowania dla dwóch różnych źródeł danych do utworzenia instancji.
Moje pytania są następujące:
1) Czy trzeba to zrobić wadę z Java lub umyślne decyzji projektowych? Jaka jest intuicja?
2) Które rozwiązanie jest najsilniejsze pod względem utrzymania dobrego kodu bez wprowadzania zbędnej złożoności? Czemu?
To pytanie jest podobne: Designing constructors around type erasure in Java, ale nie opisuje szczegółów, tylko sugeruje różne rozwiązania.
po co to robić, dlaczego nie wpisać parametrize całej klasy? lub po prostu stworzyć fabrykę, która w każdym razie jest dobrym wzorem. –
Możesz napisać jedną funkcję, a następnie przetestować typy list na początku funkcji, a następnie wpisać rzutowanie na podstawie typu ... lub użyć lepszego języka – NKamrath
... lub możesz korzystać z realnych typów, takich jak tablice . –