Stworzenie instancji klasy na podstawie stringa

Odpowiedz Nowy wątek
2017-12-07 10:12
0

Cześć!
Szukam rozwiązania które pozwoli mi na podstawie zmiennej stworzyć instancje klasy.
Bardziej konkretnie:
Odpalam program z argumentem. Zależnie od niego potrzebuję stworzyć stworzyć instancję klasy i dalej na niej operować. Dodam że wszystkie klasy które będą w taki sposób inicjalizowane implementują jeden interfejs.
Oczywiście mógłbym użyć jakiegoś switcha albo if'a, ale nie jesteśmy zwierzętami :p
Czy mógłby ktoś nakierować mnie na rozwiązanie tego problemu?
Z góry dzięki :)

Pozostało 580 znaków

2017-12-07 10:53

Może Class.forName(..)?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2017-12-07 10:53
0

Ale ten argument to jest co? Bo jak nazwa klasy to mozesz zrobic Class.forName("").newInstance() zawsze.
Mógłyś też użyć sobie jakiegoś IoC i zrobić coś w stylu:

@Named("jakaśtamNazwa")
class X implements Y{}
 
@Named("jakaśtamInnaNazwa")
class V implements Y{}
 
@Named("jakaśtamJeszczeInnaNazwa")
class Z implements Y{}

Potem startując aplikacje skanujesz classpath i startujesz sobie wszystkie te beany a potem wyciągasz sobie z kontekstu po tej nazwie beana którego chcesz.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2017-12-07 10:55

Pozostało 580 znaków

2017-12-07 11:00
0

Dzięki za pomoc :)

Class.forName("").newInstance()

w zupełności wystarczy :)

Pozostało 580 znaków

2017-12-07 11:09
0

Jeżeli nie jesteśmy zwierzętami, to użycie Class.forName(..) nie powinno nawet przyjść do głowy jako rozwiązanie. Raz takie coś widziałem i ile ja godzin straciłem żeby dojść co się tam dzieje, to nie zliczę. Część klas była w jakiś spośób użyta, ale nie mogłem wpaść jak, bo IDE nie pomagało w żadnym calu. "Find Usages" = nic, Wywalenie klasy = nic, odpalenie aplikacji = nic, jeden bardzo specyficzny przypadek podczas działania = błąd który nie mówił nic, bo część wyjątków była olewana :/. Jak już Java ma taki fajny ficzer jak sprawdzanie podczas kompilacji, to nie widzę powodu żeby go olać.

Jeżeli chcesz zrobić w pełni dynamicznie, to użyj jakiegoś IoC jak zasugerował Shalom. Ja jednak sugeruję użycie zwykłego wzorca Factory, który na podstawie Stringa zwróci odpowiedni obiekt. Switch i If jest w tym wypadku dużo lepszy niż przeinżynierowane, ale "legitne" javowo rozwiązanie. Proponuję jednak w tej fabryce zrobić mapę String na konstruktor i na podstawie tego tworzyć. Gdy nie znajdziesz odpowiedniego konstruktora, to rzucasz IllegalStateException i jesteś zabezpieczony gdy dojdzie nowa klasa której zapomnisz zaimplementować. Jak taki przypadek wystąpi, to masz na tacy co jest nie tak.

Pokaż pozostałe 4 komentarze
Ale sprawdzenia czego? - wartek01 2017-12-07 12:22
Chociażby tego gdzie klasa jest użyta i czy w ogóle - krzysiek050 2017-12-07 12:23
Niby tak, tylko że przy IoC też nie sprawdzisz, gdzie klasa jest użyta, dowiesz się jedynie, że trafia do kontekstu springowego. No chyba że korzystasz z jakiegoś mądrzejszego pluginu. - wartek01 2017-12-07 12:29
Np. IntelliJ świetnie sprawdza czy Spring znajdzie zależność. - krzysiek050 2017-12-07 12:31
Ale jak może sprawdzić, skoro nazwa jest parametrem? - wartek01 2017-12-07 12:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0