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 :)
Może Class.forName(..)
?
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.
Dzięki za pomoc :)
Class.forName("").newInstance()
w zupełności wystarczy :)
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.