Por que o java.util.HashSet não possui um método get (Object o)?
Eu vi outras perguntas sobre como obter objetos deSet
é baseado no valor do índice e eu entendo porque isso não é possível. Mas eu não fui capaz de encontrar uma boa explicação para por que um get por objeto não é permitido, então pensei em perguntar.
HashSet
é apoiado por umHashMap
então, obter um objeto dele deve ser bastante simples. Como é agora, parece que eu teria que iterar sobre cada item noHashSet
e testar a igualdade que parece desnecessária.
Eu poderia apenas usar umMap
mas eu não tenho necessidade de um par chave: valor, eu só preciso de umSet
.
Por exemplo, digamos que tenhoFoo.java
:
package example;
import java.io.Serializable;
public class Foo implements Serializable {
String _id;
String _description;
public Foo(String id){
this._id = id
}
public void setDescription(String description){
this._description = description;
}
public String getDescription(){
return this._description;
}
public boolean equals(Object obj) {
//equals code, checks if id's are equal
}
public int hashCode() {
//hash code calculation
}
}
eExample.java
:
package example;
import java.util.HashSet;
public class Example {
public static void main(String[] args){
HashSet<Foo> set = new HashSet<Foo>();
Foo foo1 = new Foo("1");
foo1.setDescription("Number 1");
set.add(foo1);
set.add(new Foo("2"));
//I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
System.out.println(theFoo.getDescription); //Should print Number 1
}
}
É porque o método equals pretende testar a igualdade "absoluta" em vez da igualdade "lógica" (neste casocontains(Object o)
seria suficiente)?