Refleksja zamist wielkego if'a

0

Mam takiego dużego if'a:


if (A.class.getSimpleName().equals(e.getId())) {
            c= new A();
        } else if (B.class.getSimpleName().equals(e.getId())) {
            c= new B();
...

da się to może jakoś sprytnie zrobić refleksją ?
0

Da sie zrobić Class.forName() a potem newInstance() ale to co robisz to jest jakis WTF. Napisz co próbujesz osiągnąć bo ewidentnie robisz to bardzo bardzo źle...

0
if (A.class.getSimpleName().equals(e.getId())) {
            c= new A();
        } else if (B.class.getSimpleName().equals(e.getId())) {
            c= new B();

wyciagam z bazy obiekt e, w zaleznosci od id tworze odpowiedni obiekt c

0

No ale dlaczego w bazie po prostu nie trzymasz odpowiedniego obiektu? Bo ja rozumiem że używasz jakiegoś ORMa?

0

uzywam hibernate.

Ten obiekt c to nie zwykla klasa, ale taki procesor laczacy sie z roznymi restami itd.

0

To ja w ogóle nie rozumiem w czym rzecz. Skoro to jest zwykły obiekt to czemu w bazie trzymasz nazwę klasy zamiast obiektu jako takiego? o_O

0

jak mozna do bazy danych wrzucic obiekt caly, ktory posiada jakies metody (to jest proste POJO) ?

*to nie jest proste POJO

0

Ty sobie teraz żartujesz? A jaki to jest niby problem? Kto ci powiedział że Hibernate może wrzucać do bazy tylko obiekty bez metod? o_O Możesz wrzucać cokolwiek...

0

w sensie te processor nie zawiera niz sensownego do storowania w bazie danych.

Istnieje jakakolwiek mozliwość by zapisać w bazie danych za pomocą hibernate caly obiekt (majacy wiele prywatnych metod liczacych rozne rzeczy, laczacy sie z serwisami przez REST itd.), a nie zwykla klase-encje ?

w tutorialach sa zawsze takie proste pojo...

jak ma wygladac mapping, trzeba uczynic z procesora klase encje, czy nie trzeba ?

np.

mam jakas storwalna encje:

...
String a;

Procesor p;
...

czy ten procesor potrzebuje jakies dodatkowe adnotacje ?

0

No ten procesor też musi mieć @Entity i tyle. Ty chyba nie do końca rozumiesz czym są w javie klasy. W bazie nie zapisuje się żadnych metod bo nie ma takiej potrzeby. Metody są "przechowywane" w metaklasie globalnie dla wszystkich obiektów danej klasy.

0

ok, a jaka reprezentacje po stronie bazy danych bedzie miec ten processor ?

0

Nie rozumiem pytania. Taką jaką sobie zdefiniujesz. Jak nie ma żadnych pól to w bazie pewnie będzie tylko ID i tyle. Zamiast zadawać głupie pytania to sprawdź.

0

Jeśli chodzi o kreowanie obiektów wg nazwy to może pomóc Dependency Injection (DI), np. Guice, ale to długa historia...

http://stackoverflow.com/questions/12290164/guice-using-name-to-create-object

0

dla mnie po prostu jest to neizrozumiale...

i zaraz to przetestuje, a to jest powszechna praktyka, ze savuje sie w bazie takie cale obiekty zlozone, a nie tylko proste pojo (wrappery na dane/wyniki) ?

jak to dziala, ze odczytujac z bazy, bede miala caly dzialajacy obiekt, zwyklym sql'em nie jestem w stanie dodac czegos takiego do bazy przeciez...

Probuje zapisac ten processor do encji Query, dodalam do procesora adnotacje @Entity i w encji Query pole processor.

error:

Could not determine type for: org...AProcessor, at table: e_desc_query, for columns: [org.hibernate.mapping.Column(processor)] (AProcessor po dzidziczy z jednej kalsy abstrakcyjnej)

czy my się zrozumielismy, zapisanei czegos takeigo jest mozliwe ?

0

Ok. Rozumiem w czym rzecz.

Mamy sobie klasę X w której jest sobie zaszyty bezstanowy procesor. Zapis samego procesora w bazie danych nic nie da, bo nie posiada on własnych danych. Procesor reprezentuje pewną strategię przypisaną do klasy X. To jaka ma to być strategia jest już istotne. Zatem do bazy powinna trafić informacja w rodzaju

X -> KlasaProcesora

Następnie przy odczycie należy na podstawie pobranej klasy procesora (pobranej z bazy przez nazwę) utworzyć odpowiedni procesor i przypisać go do naszego X.

IMO, choć nie jest to najlepsze rozwiązanie:

@Column(name = "PROC_NAME") 
public String getProcessorName(){
    return procesor.getClass().getCanonicalName(); 
}

public void setProcessorName(String className)  throws Exception{
    procesor = Class.forName(className).newInstance();
}

Coś w ten deseń. Trochę lepszym rozwiązaniem było by bezpośrednie użycie czy to DI (trudne, bo wymaga dobrania się do kontekstu w "jakiś" sposób) lub też wykorzystanie pośrednie DI czyli zamiast uderzać do kontekstu uderzamy do jakiegoś serwisu. Jeszcze inne rozwiązanie to ServiceLoader > Własne usługi w JSE

0

ok, no to wlasnie tak teraz zrobilam.

Ale mam metlik w glowie.

Istnieje jakas mozliwosc zapisania w bazie danych klasy przy uzyciu hibernate'a, ktora nie jest prostym obiektem POJO (konstuktor, PROSTE typy, gettery/settery) ?

Czy jest mozliwosc zapisu obiektu, ktory wykonuje mas obliczen, laczy sie z innymi toolami itp. ?

0

@Koziołek jak to niby zapis całego obiektu w bazie nic nie da? Od kiedy? Przecież możemy zwyczajnie zapisać cały obiekt w bazie (tylko trzeba to zrobić z głową i odpowiednio ustawić dziedziczenie) i po jego wczytaniu będziemy mieli poprawny obiekt bez potrzeby ręcznego tworzenia obiektów refleksją. Przeciez jak się użyje strategii dziedziczenia @Inheritance(strategy=InheritanceType.SINGLE_TABLE) to generalnie Hibernate zrobi dokładnie to samo, tylko że będzie robił to "za nas" (tzn zapisze sobie w bazie stringa który określa z którym obiektem mamy do czynienia i potem odtworzy poprawnie obiekt przy wyciąganiu z bazy).

@marta_o jeszcze raz mówię: metody są przechowywane w definicji klasy dostępnej w runtime maszyny wirtualnej i tyle. W bazie zapisujesz tylko typ obiektu i jego parametry a hibernate sobie potem to odtwarza. Metody zawsze działają...

1

@marta_o, nie ma i nie ma potrzeby, bo dane klasy są zpisywane w pliku class. W bazie zapisujesz STAN OBIEKTU.

@Shalom, obiekt bezstanowy, bez ID zapisujesz tylko nazwę klasy (sprawa dziedziczenia)... w sumie czemu by nie. Wszytko w jedną tabelę http://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Single_Table_Inheritance

0

Nie jest powiedziane, że każda z tych klas ma takie same pola.Być może zapisanie zserializowanego obiektu klasy będzie prostszym rozwiązaniem. Poza tym wspólny interfejs dla wszystkich takich klas też by nieco ułatwił.
Idąc dalej może jest chodzi o konieczność przechowywania źródeł klasy w bazie danych? To by miało sens przy tworzeniu systemy pluginów dla wielu aplikacji klienckich używających tej samej bazy danych. Ale to może zbyt szalona koncepcja jest ...

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