como implementar to muitos para muitos em java

5
Como implementar relacionamento muitos-para-muitos em Java Um exemplo de relacionamento muitos-para-muitos é aquele que se estabelece entre as classes Livro e Autor: um livro pode ser escrito por um ou muitos autores; um autor pode escrever um ou muitos livros. O diagrama de classes abaixo ilustra a situação: Para implementar relacionamentos desse tipo, muitos-para-muitos, em Java, … 1. Insira, em ambas as classes, um atributo do tipo coleção (Set, por exemplo); 2. Insira os métodos get e set correspondentes ao atributo coleção; 3. Insira métodos para adicionar e remover objetos na coleção O detalhe importante é o seguinte: insira nos métodos adicionar e remover chamadas para os métodos correspondentes da outra classe. Por exemplo: no método adicionarAutor, da classe Livro, chame o método adicionarLivro da classe Autor. Já no método adicionarLivro da classe Autor, chame o método adicionarAutor da classe Livro. Para evitar um loop infinito, teste antes se o objeto já não foi incluído ou removido da coleção. Vamos aos códigos… Código da classe Livro Observe os métodos adicionarAutor e removerAutor. Veja como eles invocam os métodos correspondentes da classe Autor, adicionarLivro e removerLivro, respectivamente. [source language='java'] import java.util.Collections; import java.util.HashSet;

Upload: augustonunes

Post on 02-Dec-2014

131 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Como Implementar to Muitos Para Muitos Em Java

Como implementar relacionamento muitos-para-muitos em Java

Um exemplo de relacionamento muitos-para-muitos é aquele que se estabelece entre as classes Livro e Autor: um livro pode ser escrito por um ou muitos autores; um autor pode escrever um ou muitos livros. O diagrama de classes abaixo ilustra a situação:

Para implementar relacionamentos desse tipo, muitos-para-muitos, em Java, …

1. Insira, em ambas as classes, um atributo do tipo coleção (Set, por exemplo);2. Insira os métodos get e set correspondentes ao atributo coleção;3. Insira métodos para adicionar e remover objetos na coleção

O detalhe importante é o seguinte: insira nos métodos adicionar e remover chamadas para os métodos correspondentes da outra classe. Por exemplo: no método adicionarAutor, da classe Livro, chame o método adicionarLivro da classe Autor. Já no método adicionarLivro da classe Autor, chame o método adicionarAutor da classe Livro. Para evitar um loop infinito, teste antes se o objeto já não foi incluído ou removido da coleção.

Vamos aos códigos…

Código da classe Livro

Observe os métodos adicionarAutor e removerAutor. Veja como eles invocam os métodos correspondentes da classe Autor, adicionarLivro e removerLivro, respectivamente.

[source language='java']import java.util.Collections;import java.util.HashSet;import java.util.Iterator;import java.util.Set;

public class Livro {private String titulo;private Set autores;

public Livro() {super();this.autores = new HashSet();}public Livro(String titulo){this.titulo = titulo;this.autores = new HashSet();

Page 2: Como Implementar to Muitos Para Muitos Em Java

}public void setTitulo(String titulo) {this.titulo = titulo;}public String getTitulo() {return titulo;}public void setAutores(Set autores) {Iterator iterator = autores.iterator();while (iterator.hasNext()){Autor autor = (Autor)iterator.next();this.adicionarAutor(autor);}}public Set getAutores() {return Collections.unmodifiableSet(this.autores);}public void adicionarAutor(Autor autor){if (!this.getAutores().contains(autor)){this.autores.add(autor);autor.adicionarLivro(this);}}public void removerAutor(Autor autor){if (!this.getAutores().contains(autor)){this.autores.remove(autor);autor.removerLivro(this);}}}[/source]

Código da classe Autor

Mais uma vez, observe os métodos adicionarLivro e removerLivro. Veja como eles invocam os métodos correspondentes da classe Livro, adicionarAutor e removerAutor, respectivamente.

[source language='java']import java.util.Collections;import java.util.HashSet;import java.util.Iterator;import java.util.Set;

public class Autor {private String nome;private Set livros;

public Autor() {super();this.livros = new HashSet ();}

Page 3: Como Implementar to Muitos Para Muitos Em Java

public Autor(String nome){this.nome = nome;this.livros = new HashSet ();}

public void setNome(String nome) {this.nome = nome;}

public String getNome() {return nome;}

public void setLivros(Set livros) {Iterator iterator = livros.iterator();while (iterator.hasNext()){Livro livro = (Livro)iterator.next();this.adicionarLivro(livro);}}

public Set getLivros() {return Collections.unmodifiableSet(this.livros);}

public void adicionarLivro(Livro livro){if (!this.getLivros().contains(livro)){this.livros.add(livro);livro.adicionarAutor(this);}}public void removerLivro(Livro livro){if (!this.getLivros().contains(livro)){this.livros.remove(livro);livro.removerAutor(this);}}}[/source]

Agora um aplicativo que demostra o uso das classes Livro e Autor:

[source language='java']import java.util.HashSet;import java.util.Iterator;import java.util.Set;

public class AppMuitosParaMuitos {

public static void main(String[] args) {Livro livro01 = new Livro(“Livro 01″);Livro livro02 = new Livro(“Livro 02″);

Page 4: Como Implementar to Muitos Para Muitos Em Java

Set livros = new HashSet();livros.add(livro01);livros.add(livro02);

Autor autor01 = new Autor(“Autor 01″);Autor autor02 = new Autor(“Autor 02″);

autor01.setLivros(livros);autor02.setLivros(livros);

Livro livro03 = new Livro(“Livro 03″);Livro livro04 = new Livro(“Livro 04″);

Autor autor03 = new Autor(“Autor 03″);autor03.adicionarLivro(livro01);autor03.adicionarLivro(livro03);autor03.adicionarLivro(livro04);

System.out.println(“Autores do Livro 02:”);Iterator iterator = livro02.getAutores().iterator();while (iterator.hasNext()){Autor autor = (Autor)iterator.next();System.out.println(autor.getNome());}System.out.println(“==================”);System.out.println(“Livros do Autor 03″);iterator = autor03.getLivros().iterator();while(iterator.hasNext()){Livro livro = (Livro)iterator.next();System.out.println(livro.getTitulo());}}}[/source]

É isso, pessoal.