Erros Mais Frequentes:

Programação 3: Orientação a Objetos e Java


Tentar acessar um método de um objeto que não existe

Usar um tipo como um objeto

Usar "super" para chamar um método herdado, que não houve overriding

Usar "return" sem ser no fim do método

Não uso do "cast"

Parâmetros sem significado

Mal Uso do Atributo Private

Colocar Atributos Numa Classe que não Pertencem a Ela


-Tentar acessar um método de um objeto que não existe:

Exemplo: Defina em Java a classe Cliente cujos objetos são clientes de uma empresa telefônica; os clientes têm nome e endereço (rua,num). Defina também a operação rua que retorna a rua onde um determinado cliente reside.

Errado:


class Endereco {
	private String rua;
	private String num;

	public String rua() {
		return rua;
		}	
	}

class Cliente {
	String nome;
	Endereco end;
	
	String rua() {
		return (end.rua()); //Estou tentando acessar um objeto 
				  // que eu não sei se existe 
		}
	}

Soluções:

Primeira solução:


class Cliente{
		.
		.
 	String rua() {
		String temp=" ";
		if(end != null) // assim eu tenho certeza de que o objeto existe
		   temp = end.rua();
		return temp; // o return deve vim no fim do método
		}
	}

Outra solução:

	
class Cliente{
		.
		.
	Cliente (String n) {
		nome = n;
		end = new Endereco ();
		}
		// Assim, eu tenho certeza de que toda vez que eu crio o objeto Cliente, eu 
		// crio tambem o objeto Endereco e então posso acessá-lo

	String rua() {
		return (end.rua())
		}
	}

- Usar um tipo como um objeto:

Errado:


char a = null;
//ou
int i = null; 
"char" e "int" são tipos e não objetos. Os objetos são "Character" e "Integer", que podem ser criados através dos tipos.

Por exemplo, String é um objeto, logo, o código abaixo está
Correto:

String str = null;


- Usar "super" para chamar um método herdado, que não houve overriding:



	class ConjA {
		.
		.
		.
		void insere(int a){ ... }
		.
		.
		.
	}
		
	class ConjB extends ConjA {
		int x =0;
		.
		.
		void reinsere () {
			
			super.insere(x); //ERRO, pois o método "insere" pertence à classe
					 //ConjB por herança e, portano, não é necessário
					 //escrever "super.insere(x)", basta colocar "insere(x)".
					 //Só quando houver overriding de um método é que se 
					 //escreve com "super.".

- Usar "return" sem ser no fim do método:

Errado:


	boolean procura (int elem) {
		if (elem == 0)
		    return true;
		else
		   return false;
		}
Certo:

	boolean procura (int elem) {
		boolean retorno = false;
		if (elem == 0)
		    retorno =  true;
		else
		   retorno = false;
		return retorno;
		}

-Não uso do "cast":

Errado:


	Ex: String str = "teste";
	    String str1 = str.clone();//errado, pois como o método clone() pertence à classe 		 
				      //Object,(classe que todas as outras classes são filhas)
				      //é preciso um "cast" para especificar que é um clone de 
				      //um String, nesse caso particular.

Certo:


	    String str = "teste";
	    String str1 = (String)str.clone();

-Parâmetros sem significado:

    Pergunta: Qual é a interface de uma classe? Em outras palavras, o que é que uma pessoa deve conhecer sobre a classe para utilizá-la?
    Resposta: as assinaturas dos métodos não privados. (vamos tratar o construtor como um método).

    Exemplo: public Livro (String t, String a, int n)

    Alguém pode dizer que parâmetros devem ser passados para este construtor de Livro?
    Os nomes dos parâmetros devem indicar os seus significados. Esta é a única forma de se garantir que uma outra pessoa, por exemplo um membro da sua equipe de projeto, possa compreender o que a sua classe faz.


-Mal Uso do Atributo Private:

    Ao se criar um atributo privado em uma classe , é aconselhável criar formas de acesso a este atributo, tanto para leitura quanto para escrita, a não ser que ele seja usado apenas para controle interno da classe. O código abaixo, por exemplo, compila sem acusar erro nenhum, mas não serve para absolutamente nada,ou seja, nenhuma outra classe pode acessá-lo, nem eles estão sendo usados por sua própria classe.

public class DadosPessoais {
    private long identidade;
    private String cpf;
    private String Endereco;
    private int anoNascimento;
}


-Colocar Atributos Numa Classe que não Pertencem a Ela:

    Exemplo: uma classe Conta deve ter apenas os atributos de uma conta de um banco, uma vez que um objeto desta classe é a representação para uma (e apenas uma) conta do mundo real. Não faz sentido que esta classe Conta tenha o atributo saldoTotal, pois ele (deveria) ser exatamente igual ao saldo!
    Outro exemplo: na classe Pessoa, não faz sentido um dos atributos da classe ser o ano atual, mesmo que isso facilite no cálculo da idade da pessoa, isso não está de acordo com uma programação orientada a objeto.


Luciano Barbosa (lab@di.ufpe.br)