Ver Mensaje Individual
  #3 (permalink)  
Antiguo 24/07/2015, 12:37
Avatar de GusGarsaky
GusGarsaky
 
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 10 años
Puntos: 2
Respuesta: Tamplate <t> en java

Se llama Generics y es una característica que apareció en Java 5. El uso de Generics nos permite poder convertir una variable temporal a un tipo de dato en tiempo de ejecución, o asegurarnos que solo se pueda manejar un tipo de dato.

1) Listas

Código Java:
Ver original
  1. public class Hamper<T> implements Iterable<T> {
  2.  
  3.     private List<T> list = new ArrayList<>();
  4.     private static final int LIMIT = 10;
  5.  
  6.     public void add(T item) {
  7.     if(list.size() < LIMIT) {
  8.         list.add(item);
  9.     } else {
  10.         throw new RuntimeException("Ya no caben más");
  11.     }
  12.     }
  13.  
  14.     public Iterator<T> iterator() {
  15.     return list.iterator();
  16.     }
  17. }

Y tenemos estos tipos de dulces:

Código Java:
Ver original
  1. public class Cookie {
  2.     ...
  3. }
  4.  
  5. public class Chocolate {
  6.     ...
  7. }
  8.  
  9. public class Candy {
  10.     ...
  11. }

Ahora, podemos hacer guardar objetos de todo tipo en nuestra canasta (Hamper):

Código Java:
Ver original
  1. Hamper<Chocolate> hamper1 = new Hamper<Chocolate>();
  2. Hamper<Cookie> hamper2 = new Hamper<Cookies>();
  3. Hamper<Candy> hamper3 = new Hamper<Cany>();
  4.  
  5. hamper1.add(new Chocolate());
  6. hamper2.add(new Cookie());
  7. hamper3.add(new Candy());

Como ves no necesito crear 3 clases para cada canasta, con Generics solo hago una genérica para los 3 dulces.

2) Un DAO genérico

Código Java:
Ver original
  1. public interface GenericDao<T> {
  2.     T getById(int id);
  3.     List<T> getAll(int id);
  4. }
  5.  
  6. public class GenericDaoImpl implements GenericDao {
  7.    
  8.     private Class<T> clazz;
  9.     @PersistenceContext
  10.     private EntityManager em;
  11.  
  12.     public GenericDaoImpl(Class<T> clazz) {
  13.     this.clazz = clazz;
  14.     }
  15.  
  16.     @Override
  17.     public T save(T entity) {
  18.         EntityTransaction tx = em.getTransaction();
  19.         tx.begin();
  20.         em.persist(entity);
  21.         tx.commit();
  22.     }
  23.  
  24.     @Override
  25.     public List<T> getAll() {
  26.     EntityTransaction tx = em.getTransaction();
  27.     tx.begin();
  28.         String entityName = clazz.getSimpleName();
  29.     (List<T>) return em.createQuery("SELECT t FROM " + entityName + " t";
  30.     }
  31. }

Y podemos hacer DAOs de todo tipo:

Código Java:
Ver original
  1. public class UserDao extends GenericDaoImpl<User> {
  2.  
  3.     public UserDao() {
  4.     super(User.class);
  5.     }
  6.  
  7. }
  8.  
  9. public class ReportDao extends GenericDaoImpl<Report> {
  10.  
  11.     public ReportDao() {
  12.     super(Report.class);
  13.     }
  14. }

Y podrías usarlos sin problemas:

Código Java:
Ver original
  1. List<User> allUsers = userDao.getAll();


Como ves, Generics nos ayuda mucho en hacer nuestras aplicaciones más dinámicas. Espero haya quedado más claro.

Última edición por GusGarsaky; 25/07/2015 a las 13:30