Sobrescrita do Método equals() e hashCode(); Ajudaaa!

olá pessoal, eu tenho um probleminha, tenho que fazer um cadastro de várias obras e guardálas em um ArrayList de objetos. Até ai blz sem problemas, mas eu não posso cadastrar obras que tenham o mesmo nome ou o mesmo código. Para isso precisarei sobrescrever o método equals e por consequencia o hashCode, alguem pode me ajudar neste ponto?
Não sei como sobrescrever esses caras. Segue o codigo de minha superclasse abaixo:

import java.util.ArrayList;

abstract class Obra implements Custos, Comparable {

private String nome;
private String endereco;
private int codigo;

//abstract Obra obraMaisCara();

public Obra(String nome) {
	setNome(nome);
}

//Função para comparar o custo da obra, e tbm para usarmos o sort de collections
public int compareTo(Obra o) {

	Obra obras = (Obra) o;

	if (getCustoTotal() == obras.getCustoTotal()) {
		    return getNome().compareToIgnoreCase(obras.getNome());
	
	   } else if (getCustoTotal() < obras.getCustoTotal())
		   return 1;
	
	return -1;

}

@Override
public String toString() {

	 return "O nome e: " + getNome()+"\n";
}
	



@

@Override
public boolean equals(Object obj) {
	Obra tmp = (Obra) obj;
	if(tmp.getCodigo() == getCodigo() || tmp.getNome() == getNome()){
		return true;}
	
	return false;
}



// Classe para retornar as obas acima de:  R$ 500.000,00
public static ArrayList<Obra> obrasAcimaQuinhentos(ArrayList<Obra> obras){
    ArrayList<Obra> obraAcimaQuinhentos = new ArrayList<Obra>(); // Instancia um novo Array contendo as obras acima de 500.000,00
	System.out.println("As obras acima de R$: 500.000,00 sao: \n");
	for (int i = 0; i < obras.size(); i++) {
		if (obras.get(i).getCustoTotal() > 500.000) {
			obraAcimaQuinhentos.add(obras.get(i));
		}
	}
	return obraAcimaQuinhentos;
}


// Classe para retornar a oba mais cara
public static Obra obrasMaisCara(ArrayList<Obra> obras){
	  double maisCaro = 0.0;	
	  int position=0;
	  for (int i = 0; i < obras.size(); i++) {
			if(obras.get(i).getCustoTotal() > maisCaro){
				maisCaro = obras.get(i).getCustoTotal();
				position = i;
	    		}
			
			}
		
	      return obras.get(position); // Retorna o objeto que contém a obra mais cara, assim posso trabalhar com seus dados como quiser.
		//return position; // Retorna a posição do objeto que contém a obra mais cara, assim posso maninupul-lo como quiser.
	}

public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getEndereco() {
	return endereco;
}
public void setEndereco(String endereco) {
	this.endereco = endereco;
}
public int getCodigo() {
	return codigo;
}
public void setCodigo(int codigo) {
	this.codigo = codigo;
}

}

não entendi muito bem sua dúvida…

você quer ajuda pra reescrever o hashCode(), é isso?

não sei se você gosta de coisas automáticas mas a algumas IDEs geram ele automaticamente pra você, não sei se isso te ajuda.

É isso ai, eu não quero usar o pronto do Eclipse por exemplo. Eu quero sobrescrever ele mas não estou entendendo a lógica, eu preciso garantir que não tenha cadastro de duas obras com mesmo código ou com mesmo nome, e para isso preciso sobrescrever o método equals, e como toda vez que sobrescrever ele é uma ótima pratica sobrecrever o hashcode, preciso sobrescrevê-los para que não tenha objetos com mesmo nome ou mesmo código. entende…

Att,

vc tem que fazer alguma operação com atributos do objeto que possam ser utilizados pra identificá-lo. pra isso vc pode usar o hashCode() das String fazer alguma operação de bit com seu codigo.

Eu recomendaria você estudar o que o Eclipse lhe criou. Não é tão difícil de entender, se você for paciente.

O que que custa colocar o código entre as tags [code] ?

pq nao usa HashSet (ou alguma classe q implementa set) ao inves de ArrayList?
Collections Set nao permitem repeticao

Ajudandooooooooooooooooooooooooooooooo!!! (viu como é chato qdo alguem grita? rsrs)

Passei o olho rapido pelo seu codigo e chutaria que seu problema está aqui:

tmp.getNome() == getNome()

Nao se compara Strings dessa maneira em Java. Utilize o proprio string.equals() ou string.equalsIgnoreCase();

Acertando a subscricao do equlals, adicione seus objetos numa Collection que implement Set (Evitam duplicatas baseado no seu equals).
Se precisar que sejam ordenados de acordo com a inserção, utilize LinkedHashSet.