Orientação a Objeto - Criação de Classes

Objetivos da Seção

A Primeira Classe

A documentação da classe

Os testes

Cria um conta com nome "Jacques Sauve", cpf 123456789-01, e número 123
Verifique que o nome da conta é Jacques Sauve
Verifique que o cpf da conta é 123456789-01
Verifique que o número da conta é 123
Verifique que o saldo da conta é 0.0
Deposite R$100,00
Verifique que o saldo é R$100,00
Saque R$45,00
Verifique que o saldo é R$55,00
Tente sacar R$56,00 e verifique que não é possível
Verifique que o saldo continua em R$55,00
import junit.framework.TestCase;

public class TestContaSimples1 extends TestCase {
	public void testContaSimples1() {
		ContaSimples1 umaConta = new ContaSimples1("Jacques Sauve", "123456789-01", 123);
		assertEquals("Nome errado", "Jacques Sauve", umaConta.getNome());
		assertEquals("cpf errado", "123456789-01", umaConta.getCPF());
		assertEquals("Número errado", 123, umaConta.getNúmero());
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		umaConta.depositar(100.0);
		assertEquals("Saldo errado", 100.0, umaConta.getSaldo(), 0.005);
		assertTrue("Nao consegui sacar", umaConta.sacar(45.0));
		assertEquals("Saldo errado", 55.0, umaConta.getSaldo(), 0.005);
		assertFalse("Consegui sacar demais", umaConta.sacar(56.0));
		assertEquals("Saldo errado", 55.0, umaConta.getSaldo(), 0.005);
	}
}

junit2.jpg (940854 bytes)

O programa

/**
 * Classe de conta bancária simples.
 *
 * @author   Jacques Philippe Sauvé, jacques@dsc.ufpb.br
 * @version 1.0
 * <br>
 * Copyright (C) 1999 Universidade Federal de Campina Grande.
 */
public class ContaSimples1 {
  // atributos
  private String  nome;
  private String  cpf;
  private int     número;
  private double  saldo;

  // construtor

  /**
   * Cria uma conta a partir de um nome e cpf de pessoa física, e um número de conta.
   * @param nome O nome do titular da conta.
   * @param cpf O CPF do titular da conta.
   * @param número O número da conta.
   */
  public ContaSimples1(String nome, String cpf, int número) {
    this.nome = nome;
    this.cpf = cpf;
    this.número = número;
    saldo = 0.0;
  }

  // métodos
  /**
   * Recupera o número da conta.
   * @return O número da conta.
   */
  public int getNúmero() {
    return número;
  }

  /**
   * Recupera o nome do titular da conta.
   * @return O nome do titular da conta.
   */
  public String getNome() {
    return nome;
  }

  /**
   * Recupera o CPF do titular da conta.
   * @return O CPF do titular da conta.
   */
  public String getCPF() {
    return cpf;
  }

  /**
   * Recupera o saldo da conta.
   * @return O saldo da conta.
   */
  public double getSaldo() {
    return saldo;
  }

  /**
   * Efetua um depósito numa conta.
   * @param valor O valor a depositar.
   */
  public void depositar(double valor) {
    // credita a conta
    saldo += valor;
  }

  /**
   * Efetua sacada na conta.
   * @param valor O valor a sacar.
   * @return O sucesso ou não da operação.
   */
  public boolean sacar(double valor) {
    // debita a conta
    if(saldo - valor >= 0) {
      saldo -= valor;
      return true;
    } else {
      return false;
    }
  }

  /**
   * Transforma os dados da conta em um String.
   * @return O string com os dados da conta.
   */
  public String toString() {
    return "numero " + número
            + ", nome " + nome
            + ", saldo " + saldo;
  }
}

Os comentários Javadoc

/**
 * Classe de conta bancária simples.
 *
 * @author   Jacques Philippe Sauvé, jacques@dsc.ufpb.br
 * @version 1.0
 * <br>
 * Copyright (C) 1999 Universidade Federal de Campina Grande.
 */
javadoc -d docContaSimples1 -version -author ContaSimples1.java

A declaração da classe

public class ContaSimples1 {
public class nome {
  corpo da classe
}

Atributos

  // atributos
  private String  nome;
  private String  cpf;
  private int     número;
  private double  saldo;

O construtor

  // construtor

  /**
   * Cria uma conta a partir de um nome e cpf de pessoa física, e um número de conta.
   * @param nome O nome do titular da conta.
   * @param cpf O CPF do titular da conta.
   * @param número O número da conta.
   */
  public ContaSimples1(String nome, String cpf, int número) {
    this.nome = nome;
    this.cpf = cpf;
    this.número = número;
    saldo = 0.0;
  }
    nome = nomeTitular;

Métodos "accessor"

  // métodos
  /**
   * Recupera o número da conta.
   * @return O número da conta.
   */
  public int getNúmero() {
    return número;
  }

  /**
   * Recupera o nome do titular da conta.
   * @return O nome do titular da conta.
   */
  public String getNome() {
    return nome;
  }

  /**
   * Recupera o CPF do titular da conta.
   * @return O CPF do titular da conta.
   */
  public String getCPF() {
    return cpf;
  }

  /**
   * Recupera o saldo da conta.
   * @return O saldo da conta.
   */
  public double getSaldo() {
    return saldo;
  }

Métodos de "comportamento"

  /**
   * Efetua um depósito numa conta.
   * @param valor O valor a depositar.
   */
  public void depositar(double valor) {
    // credita a conta
    saldo += valor;
  }

  /**
   * Efetua sacada na conta.
   * @param valor O valor a sacar.
   * @return O sucesso ou não da operação.
   */
  public boolean sacar(double valor) {
    // debita a conta
    if(saldo - valor >= 0) {
      saldo -= valor;
      return true;
    } else {
      return false;
    }
  }

O método toString

  /**
   * Transforma os dados da conta em um String.
   * @return O string com os dados da conta.
   */
  public String toString() {
    return "numero " + número
            + ", nome " + nome
            + ", saldo " + saldo;
  }

A documentação da classe com UML

ContaSimples1.gif (6390 bytes)

ContaSimples1-public.gif (5000 bytes)

Usando a classe que acabamos de definir

/*
 * Movimentação simples de uma conta bancária
 */

// Programa Exemplo1
public class Exemplo1 {
  // O programa sempre tem um "método" main que é onde começa a execução
  public static void main(String args[]) {
    // Abra uma conta de número 1 para João com CPF 309140605-06
    // A conta será "referenciada" com a variável umaConta
    ContaSimples1 umaConta = new ContaSimples1("Joao", "30914060506", 1);
    // Nesta conta, deposite R$1000,00
    umaConta.depositar(1000.0);

    // Imprima o saldo da conta de João
    double saldo = umaConta.getSaldo();
    System.out.print("Saldo da conta de Joao antes do saque: ");
    System.out.println(saldo);

    // Saque R$300,00 desta conta
    umaConta.sacar(300.0);
    // Imprima o objeto umaConta
    System.out.println(umaConta);
    // Imprima o saldo da conta de João
    System.out.println("Saldo da conta de Joao depois do saque: " +
    umaConta.getSaldo());
  } // fim do método main
} // fim da classe Exemplo1
/**
 * Classe de conta bancária simples.
 *
 * @author   Jacques Philippe Sauvé, jacques@dsc.ufpb.br
 * @version 1.0
 * <br>
 * Copyright (C) 1999 Universidade Federal de Campina Grande.
 */
public class ContaSimples1 {
  // atributos
  private String  nome;
  private String  cpf;
  private int     número;
  private double  saldo;

  // construtor

  /**
   * Cria uma conta a partir de um nome e cpf de pessoa física, e um número de conta.
   * @param nome O nome do titular da conta.
   * @param cpf O CPF do titular da conta.
   * @param número O número da conta.
   */
  public ContaSimples1(String nome, String cpf, int número) {
    this.nome = nome;
    this.cpf = cpf;
    this.número = número;
    saldo = 0.0;
  }

  // métodos
  /**
   * Recupera o número da conta.
   * @return O número da conta.
   */
  public int getNúmero() {
    return número;
  }

  /**
   * Recupera o nome do titular da conta.
   * @return O nome do titular da conta.
   */
  public String getNome() {
    return nome;
  }

  /**
   * Recupera o CPF do titular da conta.
   * @return O CPF do titular da conta.
   */
  public String getCPF() {
    return cpf;
  }

  /**
   * Recupera o saldo da conta.
   * @return O saldo da conta.
   */
  public double getSaldo() {
    return saldo;
  }

  /**
   * Efetua um depósito numa conta.
   * @param valor O valor a depositar.
   */
  public void depositar(double valor) {
    // credita a conta
    saldo += valor;
  }

  /**
   * Efetua sacada na conta.
   * @param valor O valor a sacar.
   * @return O sucesso ou não da operação.
   */
  public boolean sacar(double valor) {
    // debita a conta
    if(saldo - valor >= 0) {
      saldo -= valor;
      return true;
    } else {
      return false;
    }
  }

  /**
   * Transforma os dados da conta em um String.
   * @return O string com os dados da conta.
   */
  public String toString() {
    return "numero " + número
            + ", nome " + nome
            + ", saldo " + saldo;
  }
  // O programa sempre tem um "método" main que é onde começa a execução
  public static void main(String args[]) {
    // Abra uma conta de número 1 para João com CPF 309140605-06
    // A conta será "referenciada" com a variável umaConta
    ContaSimples1 umaConta = new ContaSimples1("Joao", "30914060506", 1);
    // Nesta conta, deposite R$1000,00
    umaConta.depositar(1000.0);

    // Imprima o saldo da conta de João
    double saldo = umaConta.getSaldo();
    System.out.print("Saldo da conta de Joao antes do saque: ");
    System.out.println(saldo);

    // Saque R$300,00 desta conta
    umaConta.sacar(300.0);
    // Imprima o objeto umaConta
    System.out.println(umaConta);
    // Imprima o saldo da conta de João
    System.out.println("Saldo da conta de Joao depois do saque: " +
    umaConta.getSaldo());
  } // fim do método main
}

Palavras adicionais sobre o exemplo

Vamos falar de testes novamente ...

Tratamento de Erros

package p2.exemplos;

public class TesteDeExcecoes  {
	public static void main(String[] args) {
		new TesteDeExcecoes().doIt();
		System.out.println("bye, bye");
	}
	private void doIt() {
		try {
			System.out.println("doIt: chama a()");
			a(false);
			System.out.println("doIt: a() retornou");
			System.out.println("main: chama b()");
			b(false);
			System.out.println("doIt: b() retornou");
			System.out.println("doIt: nao capturou excecao");
		} catch(Exception ex) {
			System.out.println("doIt: capturou excecao: " + ex.getMessage());
		}
	}
	private void a(boolean lanca) throws Exception {
		System.out.println("a: chama c(" + lanca + ")");
		c(lanca);
		System.out.println("a: c() retornou");
	}
	private void c(boolean lanca) throws Exception {
		System.out.println("c: inicio");
		if(lanca) {
			System.out.println("c: vai lancar");
			throw new Exception("bomba!");
//			System.out.println("c: lancou"); // causaria erro de compilação
		}
		System.out.println("c: fim");
	}
	private void b(boolean lanca) throws Exception {
		try {
			System.out.println("b: chama c(" + lanca + ")");
			c(lanca);
			System.out.println("b: c() retornou sem excecao");
		} catch(Exception ex) {
			System.out.println("b: capturou excecao: " + ex.getMessage());
			// tire o comentário abaixo para ver o comportamento
			// throw ex;
			// ou então
			// throw new Exception("granada!");
		} finally {
			System.out.println("b: finally");
		}
	}
}
import junit.framework.TestCase;

public class TestContaSimples3 extends TestCase {
	public void testBasico() throws Exception {
		ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
				"123456789-01", 123);
		assertEquals("Nome errado", "Jacques Sauve", umaConta.getNome());
		assertEquals("cpf errado", "123456789-01", umaConta.getCPF());
		assertEquals("Número errado", 123, umaConta.getNúmero());
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		umaConta.depositar(100.0);
		assertEquals("Saldo errado", 100.0, umaConta.getSaldo(), 0.005);
		assertTrue("Nao consegui sacar", umaConta.sacar(45.0));
		assertEquals("Saldo errado", 55.0, umaConta.getSaldo(), 0.005);
		assertFalse("Consegui sacar demais", umaConta.sacar(56.0));
		assertEquals("Saldo errado", 55.0, umaConta.getSaldo(), 0.005);
	}

	public void testDeErrosNoConstrutor() {
		try {
			ContaSimples3 umaConta = new ContaSimples3("", "123456789-01", 123);
			fail("Esperava excecao de nome vazio");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "Nome nao pode ser nulo ou vazio",
					ex.getMessage());
		}
		try {
			ContaSimples3 umaConta = new ContaSimples3(null, "123456789-01",
					123);
			fail("Esperava excecao de nome nulo");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "Nome nao pode ser nulo ou vazio",
					ex.getMessage());
		}
		try {
			ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve", "", 123);
			fail("Esperava excecao de CPF vazio");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "CPF nao pode ser nulo ou vazio",
					ex.getMessage());
		}
		try {
			ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve", null,
					123);
			fail("Esperava excecao de CPF nulo");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "CPF nao pode ser nulo ou vazio",
					ex.getMessage());
		}
		try {
			ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
					"123456789-01", 0);
			fail("Esperava excecao de numero de conta errada");
		} catch (Exception ex) {
			assertEquals("Mensagem errada",
					"Número da conta deve ser positivo", ex.getMessage());
		}
		try {
			ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
					"123456789-01", -1);
			fail("Esperava excecao de numero de conta errada");
		} catch (Exception ex) {
			assertEquals("Mensagem errada",
					"Número da conta deve ser positivo", ex.getMessage());
		}
	}

	public void testDepositar() throws Exception {
		ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
				"123456789-01", 123);
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		umaConta.depositar(100.0);
		assertEquals("Saldo errado", 100.0, umaConta.getSaldo(), 0.005);
		umaConta.depositar(0.0);
		assertEquals("Saldo errado", 100.0, umaConta.getSaldo(), 0.005);
		try {
			umaConta.depositar(-0.01);
			fail("Esperava excecao no deposito");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "Deposito nao pode ser negativo",
					ex.getMessage());
		}
		umaConta.depositar(0.01);
		assertEquals("Saldo errado", 100.01, umaConta.getSaldo(), 0.005);
	}

	public void testSacar() throws Exception {
		ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
				"123456789-01", 123);
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		assertTrue("Nao consegui sacar", umaConta.sacar(0.0));
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		umaConta.depositar(100.0);
		assertTrue("Nao consegui sacar", umaConta.sacar(23.10));
		assertEquals("Saldo errado", 76.90, umaConta.getSaldo(), 0.005);
		assertFalse("Consegui sacar demais", umaConta.sacar(76.91));
		assertTrue("Nao consegui sacar", umaConta.sacar(76.90));
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
		try {
			umaConta.sacar(-0.01);
			fail("Esperava excecao no saque");
		} catch (Exception ex) {
			assertEquals("Mensagem errada", "Saque nao pode ser negativo", ex
					.getMessage());
		}
		assertEquals("Saldo errado", 0.0, umaConta.getSaldo(), 0.005);
	}

	public void testToString() throws Exception {
		ContaSimples3 umaConta = new ContaSimples3("Jacques Sauve",
				"123456789-01", 123);
		assertEquals("toString errado",
				"numero 123, nome Jacques Sauve, saldo 0.0", umaConta
						.toString());
		umaConta.depositar(1.23);
		assertEquals("toString errado",
				"numero 123, nome Jacques Sauve, saldo 1.23", umaConta
						.toString());
	}
}
/**
 * Classe de conta bancária simples, com tratamento de erro
 *
 * @author Jacques Philippe Sauvé, jacques@dsc.ufcg.edu.br
 * @version 1.0 <br>
 *          Copyright (C) 2006 Universidade Federal de Campina Grande.
 */
public class ContaSimples3 {
	// atributos
	private String nome;

	private String cpf;

	private int número;

	private double saldo;

	// construtor
	/**
	 * Cria uma conta a partir de um nome e cpf de pessoa física, e um numero de
	 * conta.
	 *
	 * @param nome
	 *            O nome do titular da conta.
	 * @param cpf
	 *            O CPF do titular da conta.
	 * @param número
	 *            O numero da conta.
	 * @throws Exception
	 *             Se o nome for nulo ou vazio, o CPF for nulo ou vazio ou a
	 *             conta não for um número positivo
	 */
	public ContaSimples3(String nome, String cpf, int número) throws Exception {
		if (nome == null || nome.equals("")) {
			throw new Exception("Nome nao pode ser nulo ou vazio");
		}
		if (cpf == null || cpf.equals("")) {
			throw new Exception("CPF nao pode ser nulo ou vazio");
		}
		if (número <= 0) {
			throw new Exception("Número da conta deve ser positivo");
		}
		this.nome = nome;
		this.cpf = cpf;
		this.número = número;
		saldo = 0.0;
	}

	// métodos
	/**
	 * Recupera o numero da conta.
	 *
	 * @return O numero da conta.
	 */
	public int getNúmero() {
		return número;
	}

	/**
	 * Recupera o nome do titular da conta.
	 *
	 * @return O nome do titular da conta.
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Recupera o CPF do titular da conta.
	 *
	 * @return O CPF do titular da conta.
	 */
	public String getCPF() {
		return cpf;
	}

	/**
	 * Recupera o saldo da conta.
	 *
	 * @return O saldo da conta.
	 */
	public double getSaldo() {
		return saldo;
	}

	/**
	 * Efetua um depósito numa conta.
	 *
	 * @param valor
	 *            O valor a depositar.
	 * @throws Exception
	 *             Para um deposito negativo
	 */
	public void depositar(double valor) throws Exception {
		if (valor < 0.0) {
			throw new Exception("Deposito nao pode ser negativo");
		}
		// credita a conta
		saldo += valor;
	}

	/**
	 * Efetua sacada na conta.
	 *
	 * @param valor
	 *            O valor a sacar.
	 * @return O sucesso ou não da operação.
	 * @throws Exception
	 *             Para um saque negativo
	 */
	public boolean sacar(double valor) throws Exception {
		if (valor < 0.0) {
			throw new Exception("Saque nao pode ser negativo");
		}
		// debita a conta
		if (saldo - valor >= 0) {
			saldo -= valor;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Transforma os dados da conta em um String.
	 *
	 * @return O string com os dados da conta.
	 */
	public String toString() {
		return "numero " + número + ", nome " + nome + ", saldo " + saldo;
	}

	// O programa sempre tem um "método" main que é onde começa a execução
	public static void main(String args[]) {
		try {
			// Abra uma conta de numero 1 para João com CPF 309140605-06
			// A conta será "referenciada" com a variável umaConta
			ContaSimples3 umaConta = new ContaSimples3("Joao", "30914060506", 1);
			// Nesta conta, deposite R$1000,00
			umaConta.depositar(1000.0);

			// Imprima o saldo da conta de João
			double saldo = umaConta.getSaldo();
			System.out.print("Saldo da conta de Joao antes do saque: ");
			System.out.println(saldo);

			// Saque R$300,00 desta conta
			umaConta.sacar(300.0);
			// Imprima o objeto umaConta
			System.out.println(umaConta);
			// Imprima o saldo da conta de João
			System.out.println("Saldo da conta de Joao depois do saque: "
					+ umaConta.getSaldo());
		} catch (Exception ex) {
			System.err.println(ex.getMessage());
			System.exit(1);
		}
	} // fim do método main
}

A Segunda Classe: Vários Construtores

A classe Pessoa