Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
msr

getConstructor() ?

Recommended Posts

msr

Olá,

Isto hoje é só duvidas :)

Coloco a dúvida como comentário no código, pois parece-me ser mais fácil entender dessa maneira.

public class Xpto{
    protected ClasseAbstracta x;

    public void foo(){

       // ClasseAbstracta novo = new ????? Carro ou Pessoa ?????

      /* aqui preciso de instanciar um novo objecto com classe igual à do referenciado por this.x
         sei que se fizer x.getClass() sei a classe do objecto (que será Carro ou Pessoa) , no entanto não
         estou a ver como posso sacar e UTILIZAR o(s) respectivo(s) construtor(es) */

      // ... outras operações (que dependem se é Carro ou Pessoa)
    }

}

public abstract class ClasseAbstracta {
}

public class Carro extends ClasseAbstracta{
}

public class Pessoa extends ClasseAbstracta{
}

Deu para entender a dúvida? Alguma sugestão?

Obrigado

Share this post


Link to post
Share on other sites
Baderous

Não percebi a dúvida, mas não podes instanciar classes abstractas. O que podes fazer é atribuir a uma variável de tipo estático ClasseAbstracta, uma instância de tipo dinâmico que seja seu subtipo concreto, isto é, que seja uma subclasse concreta de ClasseAbstracta.

Share this post


Link to post
Share on other sites
msr

Não percebi a dúvida, mas não podes instanciar classes abstractas. O que podes fazer é atribuir a uma variável de tipo estático ClasseAbstracta, uma instância de tipo dinâmico que seja seu subtipo concreto, isto é, que seja uma subclasse concreta de ClasseAbstracta.

Isso mesmo. Ou seja "x" é uma referência para um Carro ou para uma Pessoa (atribuição feita algures no código, que não pus aqui).

O que quero fazer no método foo() é criar um novo objecto do mesmo tipo do "x" (que pode ser Carro ou Pessoa). Para saber que classe é uso o "getClass()", no entanto como acedo ao construtor dessa classe?

Eu penso que isto passa pelo "reflection package", mas não estou a ver como utilizar o getConstructor().

Share this post


Link to post
Share on other sites
pedrix21

Podes fazer o instanceof ex:

if(obj instanceof carro){

  //obj é uma instancia de carro

}


@Pedro Lopes

Share this post


Link to post
Share on other sites
msr

O instanceof e o if/else funcionariam, mas limitadamente.

Vou concretizar um pouco mais a situação, talvez se perceba melhor.

Tenho estas classes:

- abstract Evento

- EventoReproducao extends Evento

- abstract Entidade

- Pessoa extends Entidade

- Carro extends Entidade

Um evento tem uma referência para uma Entidade (isto é um evento está sempre associado a uma entidade).  Essa entidade pode ser qualquer coisa: uma pessoa, um carro, etc. bastando para isso estender a classe Entidade.

Considerem agora este caso:

public abstract class Evento{

    protected Entidade entidade;

    public Evento(){
        this.entidade = entidade;
    }
}

public class EventoReproducao extends Evento{
    public EventoReproducao(Entidade entidade){
        super(entidade);
    }
}

Evento e = new EventoReproducao(new Pessoa()); // pai
e.foo(); // cria um filho

Ao criar um filho (:) ) preciso saber que tipo de objecto tenho que criar. Usando if/else ou instanceof poderia ver se o "pai" era do tipo Pessoa ou Carro, mas o que me interessa é que possa ser qualquer tipo de entidade.

Share this post


Link to post
Share on other sites
Knitter

Se no evento criaste uma Pessoa no método foo() queres criar também uma Pessoa? Porquê, porque é que não podes usar a instância que já tens? O que é que pretendes fazer.

Do meu ponto de vista, o que estás a explicar não faz sentido, não estou a ver uma situação onde tenhas mesmo de instanciar um objecto que seja do mesmo tipo que um outro, mas não percebi bem o problema.

De qualquer modo, a forma de fazer isso correctamente é usando Reflection, não precisas de usar muito do sistema de Reflection, é simples instanciar um objecto a partir de uma String com o nome ou da Class.

Share this post


Link to post
Share on other sites
msr

Knitter, pensa como "na realidade". Isto é um EventoReproducao que diz respeito a uma entidade. Quando esse evento ocorre é criado um "filho" com o mesmo tipo da entidade a que diz respeito esse evento.

O que pretendo é que estes eventos se possam associar a qualquer tipo de entidade, não a penas a pessoas e carros. Só sei que são entidades (que é uma classe abstracta e portanto não posso instanciar objectos), portanto quando quiser criar um filho preciso de saber o tipo da entidade a que este se refere.

De qualquer das formas, já me safei com isto, deixo aqui o código caso apareça mais alguem com a mesma duvida:

Class<? extends Entidade> c = this.entidade.getClass();
Constructor<? extends Entidade> ct = c.getDeclaredConstructor(Conjunto.class);
Entidade filho = ct.newInstance(this.entidade.conjunto);

Share this post


Link to post
Share on other sites
Knitter

Knitter, pensa como "na realidade". Isto é um EventoReproducao que diz respeito a uma entidade. Quando esse evento ocorre é criado um "filho" com o mesmo tipo da entidade a que diz respeito esse evento.

Esta descrição grita-me "clone", e sendo assim não precisas saber o tipo de dados, apenas cloná-lo.

Mas pegando no que tinha apresentado:

Evento e = new EventoReproducao(new Pessoa()); // pai

e.foo(); // cria um filho

Neste caso queres criar um filho de Pessoa ou queres criar uma nova Pessoa?

Share this post


Link to post
Share on other sites
msr

Mas pegando no que tinha apresentado:Neste caso queres criar um filho de Pessoa ou queres criar uma nova Pessoa?

Não sei se percebi a pergunta.

Não são sinónimos? Em qualquer dos casos é um novo objecto do tipo Pessoa que é criado. "filho" e "pai" sao objectos do mesmo tipo.

O filho não é um "clone" do pai, "herda" algumas características do pai apenas (ie, os atributos têm dados diferentes dos do pai).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.