Do tej pory tworząc kod z użyciem typów generycznych zawsze borykałem się z problemem - jak dobrać się do klasy na podstawie któregoś parametru. Rozwiązanie znalazłem przeglądając w internecie kod jakieś przykładowej aplikacji. Ot znowu kilka linii które uporządkują kod i zmniejszą ilość powtórzeń. :-)
Dbanie o porządek w kodzie to obowiązek każdego programisty. Stąd podział aplikacji na warstwy, wyodrębnianie wspólnego kodu do typów abstrakcyjnych i tak dalej. Są jednak miejsca, których do tej pory nie potrafiłem uporządkować dobrze - były to wszelkiego rodzaju DAO, które zawsze wyglądały podobnie. Interfejs, klasa abstrakcyjna, pochodna wywołująca chroniony konstruktor. Wszystko po to by w klasie abstrakcyjnej móc zdefiniować metodę readById. Oto przykład takiego kodu: [java]// Ogólny interfejs dostępu do danych // T to typ encji, K to typ klucza w danej encji. public interface GenericDAO<T, K> { void save(T instance); void create(T newInstance); void update(T existingInstance); boolean delete(T instance); T readById(K id); List getAll(); } // Implementacja oparta o mechanizmy Springa public abstract class AbstractDAO<T extends BaseEntity, K> extends JpaDaoSupport implements GenericDAO<T, K> { private Class typeClass; protected AbstractDAO(Class typeClass) { this.typeClass = typeClass; } // pobranie obiektu na bazie id public T readById(K id) { return getJpaTemplate().find(typeClass, id); } }
...