2016-04-12 10 views
1

Ich versuche, einen Weg zu finden, meine Klasse 'equals-Methode arbeiten entweder für den Klassentyp oder eine primitive int, aber etwas fühlt sich nicht richtig über den Ansatz I haben:Override entspricht, um gegen Klassentyp oder Primitiv int zu überprüfen

class MyClass { 
    int myID; 
    .... 
    [other class variables/methods] 
    .... 

    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof MyClass)) { 
      // False if neither an int nor a myClass 
      if (!(obj.getClass().equals(int.class))) { 
       return false 
      } 
      // If int, check against myID 
      return ((int) obj).myID == myID); 
     } 
     // If myClass check against that object's myID 
     return ((MyClass) obj).myID == myID); 
    } 
} 

der Grund, warum ich dies tun würde, wenn ich eine Arraylist myClassList habe ich, ohne manuell iterieren für .contains zu tun, entweder eine Instanz von MyClass oder ein int, in der Lage sein wollen, dass die ArrayList für einen int. Also wie folgt:

ArrayList<MyClass> myClassList = new ArrayList<MyClass>(); 

int someID = 5; 
MyClass myClass = new MyClass([initialize with myID = 5]); 
MyClass otherClass = new MyClass(myClass); 

myClassList.add(myClass); 

myClassList.contains(otherClass); // returns true 
myClassList.contains(someID); // returns true 

Ich bin noch nie zuvor darauf gestoßen, also weiß ich nicht, was der sauberste Ansatz ist.

+5

Eine 'ArrayList' kann kein primitives' int' (s) enthalten. –

+2

Das ist eine schlechte Idee. Verwenden Sie die entsprechende Technik, iterieren. Oder verwende eine Karte. – Savior

+1

Das Erstellen eines Pojos, das gleich einem 'int' sein kann, klingt wie eine schlechte Idee und kann/kann zu einem verwirrenden Code und Verhalten führen. Es könnte "cool" sein, 'myClassList.contains (someID);' zu verwenden, aber ein anderer Ansatz, wie das manuelle Iterieren, führt zu viel saubererem und unnachgiebigerem Code. – Tom

Antwort

3

Sie speichern Probleme für sich selbst, indem Sie den Vertrag der equals-Methode brechen, auch wenn Sie einen Weg finden, um es zum Laufen zu bringen.

Wie wäre es mit Java 8 Streams?

static boolean listContainsId(List<MyClass> list, int id) { 
    return list.stream().anyMatch(mc -> mc.myID == id); 
} 
1

Erstellen Sie Ihren eigenen ArrayList-Typ.

public class MyArrayList<E> extends ArrayList<E> { 

    public boolean contains(int id) { 
     return super.contains(new MyClass(id)); 
    } 
}