Considere a classe Livro apresentada a seguir.
public class Livro {
private String nomeNacional;
private int ano;
private List<String> autores;
private int edicao;
private String cidade;
private String editora;
private String nomeOriginal;
private List<String> tradutores;
private int paginas;
private long isbn;
public Livro(String nomeNacional,
int ano,
List<String> autores,
int edicao
String cidade,
String editora,
String nomeOriginal,
List<String> tradutores,
int paginas,
long isbn) {
this.nomeNacional = nomeNacional;
this.ano = ano;
this.autores = autores;
this.edicao = edicao;
this.cidade = cidade;
this.editora = editora;
this.nomeOriginal = nomeOriginal;
this.tradutores = tradutores;
this.paginas = paginas;
this.isbn = isbn;
}
// getters e setters omitidos
}
Observe o construtor da classe Livro. Veja como fica complicado escrever tantos parâmetros. Uma solução seria a utilização do padrão de projeto Builder, que seria responsável pela construção do objeto, como por exemplo.
Livro livro = new Livro.LivroBuilder("Java, como programar")
.ano(2003)
.autores("H. M. Deitel", "P. J. Deitel")
.edicao(4)
.cidade("Porto Alegre")
.editora("Bookman")
.nomeOriginal("Java How to Program")
.tradutores("Carlos Arthur Lang Lisbôa")
.paginas(1386)
.isbn(9788536301235L)
.build();
Desenvolva a solução requisitada, utilizando o padrão de projeto Builder.
/*************************************************************************
* Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br) *
* Ybadoo - Solucoes em Software Livre (ybadoo.com.br) *
* *
* Permission is granted to copy, distribute and/or modify this document *
* under the terms of the GNU Free Documentation License, Version 1.3 or *
* any later version published by the Free Software Foundation; with no *
* Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A *
* A copy of the license is included in the section entitled "GNU Free *
* Documentation License". *
* *
* Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic) *
* OpenJDK Version "1.8.0_121" *
* OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) *
*************************************************************************/
package com.ybadoo.tutoriais.poo.tutorial08.exercicio18;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.LinkedList;
import java.util.List;
/**
* Representação dos atributos de uma publicação (LIVRO)
*/
public class Livro
{
/**
* Título da publicação na língua portuguesa
*/
private String nomeNacional;
/**
* Ano da publicação
*/
private int ano;
/**
* Autores da publicação
*/
private List<String> autores;
/**
* Edição da publicação
*/
private int edicao;
/**
* Local da publicação
*/
private String cidade;
/**
* Editora responsável pela publicação
*/
private String editora;
/**
* Título original da publicação
*/
private String nomeOriginal;
/**
* Tradutores da publicação original para a língua portuguesa
*/
private List<String> tradutores;
/**
* Número de páginas da publicação
*/
private int paginas;
/**
* International Standard Book Number (ISBN) da publicação
*/
private long isbn;
/**
* Inicializar a publicação
*
* @param nomeNacional título da publicação na língua portuguesa
*/
private Livro(String nomeNacional)
{
this.nomeNacional = nomeNacional;
}
/**
* Construtor da publicação
*/
public static class LivroBuilder
{
/**
* Instância da publicação
*/
private Livro livro;
/**
* Inicializar a publicação
*
* @param nomeNacional título da publicação na língua portuguesa
*/
public LivroBuilder(String nomeNacional)
{
livro = new Livro(nomeNacional);
}
/**
* Configurar o ano da publicação
*
* @param ano ano da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder ano(int ano)
{
if (ano <= 0)
{
throw new IllegalArgumentException("Ano inválido: '" + ano + "'");
}
livro.ano = ano;
return this;
}
/**
* Configurar os autores da publicação
*
* @param autores autores da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder autores(String ... autores)
{
if (livro.autores == null)
{
livro.autores = new LinkedList<>();
}
for (String autor : autores)
{
livro.autores.add(autor);
}
return this;
}
/**
* Configurar a edição da publicação
*
* @param edicao edição da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder edicao(int edicao)
{
if (edicao <= 0)
{
throw new IllegalArgumentException("Edição inválida: '" + edicao + "'");
}
livro.edicao = edicao;
return this;
}
/**
* Configurar o local da publicação
*
* @param cidade local da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder cidade(String cidade)
{
livro.cidade = cidade;
return this;
}
/**
* Configurar a editora responsável pela publicação
*
* @param editora editora responsável pela publicação
* @return instância do construtor da publicação
*/
public LivroBuilder editora(String editora)
{
livro.editora = editora;
return this;
}
/**
* Configurar o título original da publicação
*
* @param nomeOriginal título original da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder nomeOriginal(String nomeOriginal)
{
livro.nomeOriginal = nomeOriginal;
return this;
}
/**
* Configurar os tradutores da publicação original para a língua portuguesa
*
* @param tradutores tradutor da publicação original para a língua portuguesa
* @return instância do construtor da publicação
*/
public LivroBuilder tradutores(String ... tradutores)
{
if (livro.tradutores == null)
{
livro.tradutores = new LinkedList<>();
}
for (String tradutor : tradutores)
{
livro.tradutores.add(tradutor);
}
return this;
}
/**
* Configurar o número de páginas da publicação
*
* @param paginas número de páginas da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder paginas(int paginas)
{
if (paginas <= 0)
{
throw new IllegalArgumentException("Número de páginas inválido: '" + paginas + "'");
}
livro.paginas = paginas;
return this;
}
/**
* Configurar o International Standard Book Number (ISBN) da publicação
*
* @param isbn International Standard Book Number (ISBN) da publicação
* @return instância do construtor da publicação
*/
public LivroBuilder isbn(long isbn)
{
String aux = new Long(isbn).toString();
if ((aux.length() != 13) || (!aux.startsWith("978")))
{
throw new IllegalArgumentException("ISBN inválido: '" + livro.getIsbnFormat(isbn) + "'");
}
livro.isbn = isbn;
return this;
}
/**
* Retornar a instância da publicação configurada
*
* @return instância da publicação configurada
*/
public Livro build()
{
return livro;
}
}
/**
* Retornar o título da publicação na língua portuguesa
*
* @return título da publicação na língua portuguesa
*/
public String getNomeNacional()
{
return nomeNacional;
}
/**
* Retornar o ano da publicação
*
* @return ano da publicação
*/
public int getAno()
{
return ano;
}
/**
* Retornar os autores da publicação
*
* @return autores da publicação
*/
public List<String> getAutores()
{
return autores;
}
/**
* Retornar a edição da publicação
*
* @return edição da publicação
*/
public int getEdicao()
{
return edicao;
}
/**
* Retornar o local da publicação
*
* @return local da publicação
*/
public String getCidade()
{
return cidade;
}
/**
* Retornar a editora responsável pela publicação
*
* @return editora responsável pela publicação
*/
public String getEditora()
{
return editora;
}
/**
* Retornar o título original da publicação
*
* @return título original da publicação
*/
public String getNomeOriginal()
{
return nomeOriginal;
}
/**
* Retornar os tradutores da publicação original para a língua portuguesa
*
* @return tradutores da publicação original para a língua portuguesa
*/
public List<String> getTradutores()
{
return tradutores;
}
/**
* Retornar o número de páginas da publicação
*
* @return número de páginas da publicação
*/
public int getPaginas()
{
return paginas;
}
/**
* Retornar o International Standard Book Number (ISBN) da publicação
*
* @return International Standard Book Number (ISBN) da publicação
*/
public long getIsbn()
{
return isbn;
}
/**
* Retornar o International Standard Book Number (ISBN) da publicação no formato (xxx-xx-xxx-xxxx-x)
*
* @param isbn International Standard Book Number (ISBN) da publicação
* @return International Standard Book Number (ISBN) da publicação no formato (xxx-xx-xxx-xxxx-x)
*/
private String getIsbnFormat(long isbn)
{
DecimalFormat isbnDecimalFmt = new DecimalFormat("0000000000000");
String isbnRawString = isbnDecimalFmt.format(isbn);
java.text.MessageFormat isbnMsgFmt = new java.text.MessageFormat("{0}-{1}-{2}-{3}-{4}");
String[] isbnNumArr = { isbnRawString.substring(0, 3),
isbnRawString.substring(3, 5),
isbnRawString.substring(5, 8),
isbnRawString.substring(8, 12),
isbnRawString.substring(12)};
return isbnMsgFmt.format(isbnNumArr);
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
StringBuilder out = new StringBuilder();
if (autores != null)
{
boolean first = true;
for (String autor : autores)
{
if (first)
{
first = false;
}
else
{
out.append("; ");
}
int pos = autor.lastIndexOf(" ");
out.append(autor.substring(pos + 1).toUpperCase()).append(", ").append(autor.substring(0, pos));
}
out.append(". ");
}
out.append(nomeNacional);
if (nomeOriginal != null)
{
out.append(" [").append(nomeOriginal).append("]");
}
if (tradutores != null)
{
boolean first = true;
out.append(". Tradução ");
for (String tradutor : tradutores)
{
if (first)
{
first = false;
}
else
{
out.append("; ");
}
out.append(tradutor);
}
}
if (edicao > 1)
{
out.append(". ").append(edicao).append("ª edição");
}
if (cidade != null)
{
out.append(". ").append(cidade);
if (editora != null)
{
out.append(": ").append(editora);
if (ano > 0)
{
out.append(", ").append(ano);
}
}
else if (ano > 0)
{
out.append(". ").append(ano);
}
}
else if (editora != null)
{
out.append(". ").append(editora);
if (ano > 0)
{
out.append(", ").append(ano);
}
}
else if (ano > 0)
{
out.append(". ").append(ano);
}
if (paginas > 0)
{
out.append(". ").append(NumberFormat.getIntegerInstance().format(paginas)).append(" páginas");
}
if (isbn > 0)
{
out.append(". ISBN ").append(getIsbnFormat(isbn));
}
out.append(".");
return out.toString();
}
}
/*************************************************************************
* Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br) *
* Ybadoo - Solucoes em Software Livre (ybadoo.com.br) *
* *
* Permission is granted to copy, distribute and/or modify this document *
* under the terms of the GNU Free Documentation License, Version 1.3 or *
* any later version published by the Free Software Foundation; with no *
* Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A *
* A copy of the license is included in the section entitled "GNU Free *
* Documentation License". *
* *
* Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic) *
* OpenJDK Version "1.8.0_121" *
* OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) *
*************************************************************************/
package com.ybadoo.tutoriais.poo.tutorial08.exercicio18;
/**
* Classe responsável pela execução do padrão de projeto Builder
*/
public class Application
{
/**
* Construtor para inicializar a execução do padrão de projeto
* Builder
*/
private Application()
{
}
/**
* Método principal da linguagem de programação Java
*
* @param args argumentos da linha de comando (não utilizado)
*/
public static void main(String[] args)
{
Livro livro = new Livro.LivroBuilder("Java, como programar")
.ano(2003)
.autores("H. M. Deitel", "P. J. Deitel")
.edicao(4)
.cidade("Porto Alegre")
.editora("Bookman")
.nomeOriginal("Java How to Program")
.tradutores("Carlos Arthur Lang Lisbôa")
.paginas(1386)
.isbn(9788536301235L)
.build();
System.out.println(livro);
}
}