Herança e métodos

8 respostas
Marcelo_Magalhaes

Caros amigos,

Gostaria de saber se tem como eu resolver o seguinte problema. Tenho uma estrutura que contém uma classe A e diversas classes que herdam (extends) desta (B, C, D, etc.) Esta classe A é abstrata e contém alguns métodos, contudo tenho dois métodos anotados com @PostContruct e@PreDestroy que quero que obrigatoriamente seja executados pelas classes que herdam de A. Agora tem outra questão... este métodos anotados tem algumas linhas que devem sempre ser executadas, ou seja, o que quero mais ou menos é o seguinte fluxo; quando alguém der new B() o método anotado por @PostConstruct da classe A seja executado e depois seja executado o método da classe B que também está anotado com @PostConstruct. A mesma regra deve ser usara para o @PreDestroy. Tem como fazer isso???

Abraços a todos.

8 Respostas

nel

Você leu a especificação dessas anotações ?
Eu conheço elas mas não sei se ela são passíveis de serem estendidas.

Mas estamos falando em EJB ? Não né ?

yurifw

chamar esse metodo no construtor da classe A nresolve seu problema n?
pq sempre que uma classe é instanciada, o construtor é chamado, e o metodo construtor sempre chama os construtores das superclasses, por exemplo, qdo vc instanciar a classe B ocorreria isso:
o construtor de B é execuatdo, ele chama o construtor de A e o construtor de A chama o construtor de Object, o construtor de Object é executado, volta para o construtor de A e quando ele terminar de executar, o construtor de B é executado

Rodrigo_Sasaki

Só uma pergunta, você já testou pra ver se isso funciona?

Rodrigo_Sasaki

yurifw:
chamar esse metodo no construtor da classe A nresolve seu problema n?
pq sempre que uma classe é instanciada, o construtor é chamado, e o metodo construtor sempre chama os construtores das superclasses, por exemplo, qdo vc instanciar a classe B ocorreria isso:
o construtor de B é execuatdo, ele chama o construtor de A e o construtor de A chama o construtor de Object, o construtor de Object é executado, volta para o construtor de A e quando ele terminar de executar, o construtor de B é executado

O problema de usar o construtor é que quando ele é executado, nenhuma dependência foi injetada ainda.

nel
yurifw:
chamar esse metodo no construtor da classe A nresolve seu problema n? pq sempre que uma classe é instanciada, o construtor é chamado, e o metodo construtor sempre chama os construtores das superclasses, por exemplo, qdo vc instanciar a classe B ocorreria isso: o construtor de B é execuatdo, ele chama o construtor de A e o construtor de A chama o construtor de Object, o construtor de Object é executado, volta para o construtor de A e quando ele terminar de executar, o construtor de B é executado

Tem certeza ? Você disse "sempre". O que ocorre nesse caso:

public class A {
   public A(int x) { System.out.println(x); };
   }
}

public class B extends A {

}
yurifw
nel:
yurifw:
chamar esse metodo no construtor da classe A nresolve seu problema n? pq sempre que uma classe é instanciada, o construtor é chamado, e o metodo construtor sempre chama os construtores das superclasses, por exemplo, qdo vc instanciar a classe B ocorreria isso: o construtor de B é execuatdo, ele chama o construtor de A e o construtor de A chama o construtor de Object, o construtor de Object é executado, volta para o construtor de A e quando ele terminar de executar, o construtor de B é executado

Tem certeza ? Você disse "sempre". O que ocorre nesse caso:

public class A {
   public A(int x) { System.out.println(x); };
   }
}

public class B extends A {

}
acredito q n compilaria, pq a classe B tentaria chamar um construtor sem argumento, nesse caso como a classe A so tem um construtor que pede um int vc tem q especificar isso e criar um construtor no B que passa um int:
public B{
   super(2);
}
acho q seria isso :P

mas de qualquer jeito ele tentaria chamar o construtor, so q n conseguiria ai vc teria q chamar manualmente não é?

nel
yurifw:
nel:
yurifw:
chamar esse metodo no construtor da classe A nresolve seu problema n? pq sempre que uma classe é instanciada, o construtor é chamado, e o metodo construtor sempre chama os construtores das superclasses, por exemplo, qdo vc instanciar a classe B ocorreria isso: o construtor de B é execuatdo, ele chama o construtor de A e o construtor de A chama o construtor de Object, o construtor de Object é executado, volta para o construtor de A e quando ele terminar de executar, o construtor de B é executado

Tem certeza ? Você disse "sempre". O que ocorre nesse caso:

public class A {
   public A(int x) { System.out.println(x); };
   }
}

public class B extends A {

}
acredito q n compilaria, pq a classe B tentaria chamar um construtor sem argumento, nesse caso como a classe A so tem um construtor que pede um int vc tem q especificar isso e criar um construtor no B que passa um int:
public B{
   super(2);
}
acho q seria isso :P

mas de qualquer jeito ele tentaria chamar o construtor, so q n conseguiria ai vc teria q chamar manualmente não é?

Sim, não compila. Só que eu acho que o nosso colega ainda está querendo trabalhar com EJB´s.
Mas vamos aguardar o que ele vai comentar.

sergiotaborda

Marcelo Magalhaes:
Caros amigos,

Gostaria de saber se tem como eu resolver o seguinte problema. Tenho uma estrutura que contém uma classe A e diversas classes que herdam (extends) desta (B, C, D, etc.) Esta classe A é abstrata e contém alguns métodos, contudo tenho dois métodos anotados com @PostContruct e@PreDestroy que quero que obrigatoriamente seja executados pelas classes que herdam de A. Agora tem outra questão... este métodos anotados tem algumas linhas que devem sempre ser executadas, ou seja, o que quero mais ou menos é o seguinte fluxo; quando alguém der new B() o método anotado por @PostConstruct da classe A seja executado e depois seja executado o método da classe B que também está anotado com @PostConstruct. A mesma regra deve ser usara para o @PreDestroy. Tem como fazer isso???

Abraços a todos.

Este é o cenário classico para uso do padrão Template Method.

o método em A não é abstrato. ele tem codigo. mas uma parte dele é deconhecida e tem que ser delegada ao filho, então é mais ou menos assimm

public abstract class A {


   @PosConstruct
   public void init(){

           // faz um codigo especifico de A

          doInit(); // chama a parte especifica dos filhos

         // faz mais alguma coisa
   }

   protected abstract doInit();
}

Isto é bom porque a notação só precisa ser usada uma vez no pai (onde ela deveria existir conceptualmente. Os métodos dos filhos são protected, logo não precisam de anotações.

Eu coloquei só um metodo, mas o init() pode chamar quandos métodos abstratos quiser.

O Template Method é exactamente para estes cenários onde ha um fluxo definido, mas os detalhes dependem da implementação de filhos. Mas o método init, já dá um “template” de comoo fluxo irá acontecer.

Criado 18 de março de 2013
Ultima resposta 18 de mar. de 2013
Respostas 8
Participantes 5