Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Curso Caelum JSF - public classa DAO<T>

Boa tarde, Não a sintaxe da classe abaixo. É possível criar uma Classe passando um array na criação como o public class DAO<T> ? A outra dúvida é: porque a classe passa um array no construtor? Ele sempre receberá os dados de um formulário de JSF armazenados em um objeto? Alguém pode me ajudar?

``` public class DAO { private final Class classe;

public DAO(Class classe) { this.classe = classe; }

public void adiciona(T t) { //consegue a entity manager EntityManager em = new JPAUtil().getEntityManager(); //abre transacao em.getTransaction().begin();

//persiste o objeto em.persist(t);

//commita a transacao em.getTransaction().commit();

//fecha a entity manager em.close(); }

//outros métodos omitidos } ```

3 respostas

Opa amigo, isto não é um Array, é um Generic.

http://docs.oracle.com/javase/tutorial/java/generics/index.html

Generics é um modo de "parametrizar" tipos.

http://blog.caelum.com.br/brincando-com-generics-o-bizarregenericdao/

Nesse post é usado também um DAO como exemplo para explicar isso.

Caio, obrigado pela ajuda. Mas alguém poderia me explicar melhor sobre esse recurso? Pois durante a video aula não explicita o seu uso. Olhei o artigo, mas não entendi muito. Alguém poderia me explicar de maneira mais objetiva o uso desse recurso?

solução!

Olá Thiago

O generic do java é utilizado quando queremos criar uma classe que pode trabalhar com diversos tipos do java. Por exemplo, imagine que precisamos criar uma classe lista que pode guardar qualquer tipo de valor (Integer, String, Double, ...) mas com a seguinte restrição, se a lista for do tipo Integer, ela só deve aceitar inteiros.

Para implementar essa lista, poderíamos utilizar o tipo Object para conseguir guardar qualquer informação, mas não conseguiríamos garantir a segunda restrição (a lista de Integer só deve aceitar Integers).

Para resolver esse problema, precisamos colocar qual é o tipo que a lista deve guardar na declaração do tipo da lista, Lista<Integer> e devemos implementar todos os métodos dessa lista recebendo e devolvendo o tipo que foi passado como argumento:

// T é o tipo passado na declaração da variável. Quando o
// usuário declara a variável como Lista<Integer>
// T será o tipo Integer
public class Lista<T> {
   // No adiciona receberemos algo que é do tipo T:
   public void adiciona(T valor){
      // implementação
   }
   // pega o valor na posição i da lista.
   // o valor é do tipo da lista, T.
   public T recupera(int i){
      // implementação
   }
}

No caso do curso, estamos implementando um DAO que pode trabalhar com qualquer tipo de entidade, entidade do tipo T:

public class DAO<T>{
   public void adiciona(T valor){

   }
   public T buscaPorId(Long id){

   }
}

Dentro do método busca por id, precisamos utilizar o EntityManager para buscar a entidade no banco, mas para isso precisamos da classe da entidade, porém essa informação é descartada pelo compilador do java. E por isso, precisamos passar a classe no construtor do DAO.

Quando queremos utilizar esse DAO, precisamos do seguinte código:

// esse dao gerencia apenas contas
DAO<Conta> contaDAO = new DAO<Conta>(Conta.class);

// Então podemos utilizá-lo para adicionar uma conta
Conta c = new Conta();
// inicializa a conta
contaDAO.adiciona(c);

// Não podemos utilizá-lo nada que não seja uma conta:
Movimentacao m = new Movimentacao();
// a linha abaixo gera um erro de compilação!
contaDAO.adiciona(m);