Implementação de relações unárias (reflexivas ou recursivas)

Gostaria de saber como se implementa em Java uma relação unária, ou seja, quando uma classe se relaciona com ela própria. Por exemplo numa relação 1 para 1 cada classe fica com um atributo do tipo da outra classe. Já procurei no google mas não encontro, Sou novo aqui e se postei esta mensagem no local errado me desculpem. Para ser mais claro envio em anexo uma imagem da situação em causa.

Desde já obrigado.

Ahn, não seria algo do tipo

public class Unaria{
 private Unaria unaria;
 //demais atributos
 //metodos
}

???

A implementação desta relação não envolve nada de especial? como um atributo do tipo Vector? Tenho duvidas porque ainda estou aprendendo a programar em java.

Vamos como o Jack, por partes.
Assim, se você precisa de apenas um atributo, é assim.
Se precisa de mais de um, aí você utiliza um Vector, List ou Map.

Ok já entendi. Obrigado drsmachado.

Sei que o tópico é antigo mas ainda não entendi muito bem. Tenho a classe pessoa e digamos que um professor pode ser Professor de manhã e aluno da mesma univerdidade de noite, em certo período ela assume o papel de Lecionador e também pode assumir o papel de lecionado. No meu caso como ficaria?

Aí depende o tipo de estrutura que você está planejando trabalhar.
Sabe a história do é um e do tem um? Então, é em situações assim que essa história faz mais sentido.
Vejamos.
Se você estender Professor de pessoa, logo, todo objeto de Professor, será, também, filho de Pessoa.
Uma pessoa, sabe-se, pode ser várias “coisas” diferentes, pode ser aluno, professor, músico, médico, engenheiro e político, sem que um interfira no outro.

No teu caso, em específico, eu faria uso da composição, tanto para a classe Professor, quanto para a aluno.
Explico.
É possível controlar instâncias de objetos, utilizando o pattern singleton, logo, você pode controlar quantos objetos de Pessoa existem na execução do teu programa.
Assim sendo, se existe uma pessoa, que é um atributo de um objeto da classe Professor, você consegue identificar e então, fazer com que esta pessoa seja associada ao objeto de Aluno, ao qual ele se refere.

Como assim?
Como professor e aluno, ambos, possuirão um atributo pessoa, objeto da classe Pessoa, uma simples análise no hashset deste já resolve.

[quote=drsmachado]Aí depende o tipo de estrutura que você está planejando trabalhar.
Sabe a história do é um e do tem um? Então, é em situações assim que essa história faz mais sentido.
Vejamos.
Se você estender Professor de pessoa, logo, todo objeto de Professor, será, também, filho de Pessoa.
Uma pessoa, sabe-se, pode ser várias “coisas” diferentes, pode ser aluno, professor, músico, médico, engenheiro e político, sem que um interfira no outro.

No teu caso, em específico, eu faria uso da composição, tanto para a classe Professor, quanto para a aluno.
Explico.
É possível controlar instâncias de objetos, utilizando o pattern singleton, logo, você pode controlar quantos objetos de Pessoa existem na execução do teu programa.
Assim sendo, se existe uma pessoa, que é um atributo de um objeto da classe Professor, você consegue identificar e então, fazer com que esta pessoa seja associada ao objeto de Aluno, ao qual ele se refere.

Como assim?
Como professor e aluno, ambos, possuirão um atributo pessoa, objeto da classe Pessoa, uma simples análise no hashset deste já resolve.[/quote]

Então ficaria mais ou menos como a imagem em anexo? Desculpe por certa ignorancia na hora da interpretação de sua resposta pois não possuo muita facilidade de absorção de certas informações mas me esforço para isso. xD

Como eu tenho que fazer um diagrama de classes e procurei sobre implementações de associações reflexivas eu não achei muita coisa, espero estar certo. E sobre o uso de Design Patterns ainda estou começando a ver como se implementa, mas ao final eu entendi o que vc quis dizer.

Aquele relacionamento informado ali, representado pela seta direcionada a partir de Professor e de Aluno para Pessoa indica herança.
Não é o caso, embora Professor e Aluno sejam Pessoa, você deve optar pela composição (seta com diamante no lado que receberá a classe componente, no caso, em Aluno e Professor).
Por que?
No meu ponto de vista (UML permite que haja mais de uma visão correta), assim você consegue identificar cada Professor que também é Aluno, através da Pessoa que ele representa.
Pois…

Pessoa pessoa = new Aluno();

Não permite que eu crie um Professor, tampouco, utilize os atributos e métodos que existem na classe Aluno.

Aquele relacionamento informado ali, representado pela seta direcionada a partir de Professor e de Aluno para Pessoa indica herança.
Não é o caso, embora Professor e Aluno sejam Pessoa, você deve optar pela composição (seta com diamante no lado que receberá a classe componente, no caso, em Aluno e Professor).
Por que?
No meu ponto de vista (UML permite que haja mais de uma visão correta), assim você consegue identificar cada Professor que também é Aluno, através da Pessoa que ele representa.
Pois…

[quote=drsmachado]

Pessoa pessoa = new Aluno();

Não permite que eu crie um Professor, tampouco, utilize os atributos e métodos que existem na classe Aluno.[/quote]

Não entendi muito bem o que vc fez quando deu o new Aluno(), o que esta acontecendo ali? Sei que deveria saber isso de cór maas ainda tenho dúvidas sobre.

Sobre deixar as classes Professor e Aluno como Todo nessa relação Todo-parte não seria incorreto? Pelo que vi em aula, se eu apresentar isso para o meu professor ele tem um treco…xD

No relacionamento de herança, pode-se instanciar um objeto da super classe utilizando como “base” uma classe filha.
Como exemplo:

Object obj = new String();

Toda String é filha de Object, assim sendo, posso instanciar um objeto obj, da classe Object, referenciando-o como new String(). Isso, por que, a primeira chamada no método construtor de qualquer classe é um super(); que instancia a super classe.
Isso causa alguns efeitos colaterais, por exemplo, se na classe filha eu tiver qualquer outro atributo ou método diferente da classe pai, estes NÃO são acessíveis para o objeto em questão. Apenas os atributos e métodos da super classe é que ficam disponíveis.

Agora esta bem mais visivel!

Então voltando e tirando uma outra dúvida:

em [quote=drsmachado]Pessoa pessoa = new Aluno();[/quote] vc fez essa instanciação a partir da classe aluno correto?

Nossa tinha coisas que deveria saber de cór e que acabei esquecendo ao deixar de programar.

O que eu fiz foi criar uma instância de Pessoa a partir de uma classe que estende Pessoa, no caso, Aluno. Poderia ter utilizado

Pessoa p = new Professor();

Desde que, Professor estendesse Pessoa.

Caro drsmachado muito obrigado pelas dicas e por solucionar a minha dúvida. Problemas resolvidos. :smiley: