Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

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.

 

Diagrama de Classes na Linguagem de Programação Java Livro.java Application.java
Diagrama de Classes
Diagrama de Classes na Linguagem de Programação Java

Arquivo Livro.java

/*************************************************************************
 * 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();
  }
}

Arquivo Application.java

/*************************************************************************
 * 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);
  }
}