2010-02-03 14 views
14

Mam wiele abstrakcyjnych klas nadrzędnych, z których moja konkretna klasa dziedziczy różne metody. Niektóre z tych metod muszą zawierać adnotacje JPA lub JAXB umieszczane na nich w konkretnej klasie. Obecnie robię to przez:Najlepszy sposób dodawania adnotacji do dziedziczonych metod

@MyLocalAnnotations 
@Override 
public method inheritedMethodHere (yadda yadda) 
    { 
    super.inheritedMethodHere(yadda yadda); 
    } 

Czy istnieje sposób, aby to zrobić bez przesłonięcia metody? Wydaje się, że takie marnotrawstwo przesłonić metodę tylko do dostarczania lokalnych adnotacji.

+0

Chciałbym również dodać, że powodem, dla którego potrzebowałem stworzyć adnotacje w konkretnych podklasach w pierwszej kolejności, było to, że używają one różnych nazw tabel w JPA i nazw elementów w JAXB. Nadklasa w tym przypadku jest również ogólna. – HDave

Odpowiedz

9

Niestety, nie ma lepszej metody niż to, co teraz robisz. Aby wykonać to, co opisujesz, musisz zastąpić tę metodę, biorąc pod uwagę, że adnotacja WZP będzie wymagać informacji specyficznych dla konkretnej klasy.

Z adnotacjami JPA masz dwie opcje - możesz opisywać metody lub możesz opisywać właściwości. W naszym projekcie ustandaryzowaliśmy właściwości adnotacji, a nie metody, ale to też nie pomoże, ponieważ właściwości są prawdopodobnie częścią konkretnej klasy. (Jeśli są w jakiś sposób współużytkowane w super-klasie, to NAPRAWDĘ będziesz musiał opisać metody i nadpisać je).

Trudno wydać zalecenie bez obejrzenia schematu, ale jeśli klasy jednostek mają tak wiele wspólnego, że mają wiele właściwości w superklasie - mogą po prostu być przechowywane w tym samym stole, być może z kolumna typu różnicowania?

Lub alternatywnie jeśli są one nie prawie identyczne, czy można po prostu odtworzyć wspólne właściwości w każdej konkretnej klasie? Być może powodujesz więcej pracy zamiast oszczędzać siebie, próbując uchwycić wspólne właściwości w super klasie. Ponieważ będziesz musiał opisywać je indywidualnie w konkretnych klasach, po prostu zadeklaruj je w konkretnych klasach. Jeśli potrzebujesz wspólnych metod, które współdziałają z tymi właściwościami, może to być oddzielna klasa narzędziowa do przechwytywania tych funkcji.

W naszym projekcie czasami używamy wspólnej super klasy dla jednostek, ale przechwytuje ona niektóre metadane dotyczące jednostki - nic, co mogłoby wpłynąć na logikę trwałości. Dlatego adnotacje JPA nie są potrzebne (ani nie miałyby sensu) w klasie abstrakcyjnej.

+0

Dziękuję za tę przemyślaną odpowiedź. W moim przypadku klasy jednostek są w 50% podobne i 50% różne! Będę nadal korzystać z oddzielnych tabel wydajności i nadal będę stosować powyższe podejście. Zazwyczaj przypisuję również metody accessor jako że (nie często) mamy w nich logikę. – HDave

Powiązane problemy