2016-07-08 8 views
0

Ich möchte eine Karte in Groovy verwenden, wo die Schlüssel Instanzen einer nicht entzifferbaren Klasse sein werden.Karte mit benutzerdefinierten Schlüssel in Groovy vs Java

Dies ist etwas, was ich in Java oft tun, und es funktioniert gut, wie in diesem Beispiel Klasse:

public class TestMap { 
    static final class Point { 
     final int x; final int y; 
     public Point(int x, int y) {this.x = x;this.y = y;} 
    } 

    public static void main(String[] args) { 
     Map<Point, String> map = new HashMap<>(); 
     final Point origin = new Point(0, 0); 
     map.put(origin, "hello world !"); 
     if(!map.containsKey(origin)) 
      throw new RuntimeException("can't find key origin in the map"); 
     if(!map.containsKey(new Point(0,0))) { 
      throw new RuntimeException("can't find new key(0,0) in the map"); 
     } 
    } 
} 

Aber wenn ich versuche, das gleiche mit Groovy zu erreichen, ist es nicht funktioniert. Warum? Hier ist eine Probe nicht funktionierendes Beispiel in Groovy:

class Point { 
    final int x; final int y 
    Point(int x, int y) { this.x = x; this.y = y } 
    public String toString() { return "{x=$x, y=$y}" } 
} 

def origin = new Point(0, 0) 
def map = [(origin): "hello"] 
map[(new Point(1,1))] = "world" 
map.put(new Point(2,2), "!") 

assert map.containsKey(origin) // this works: when it's the same ref 
assert map.containsKey(new Point(0,0)) 
assert map.containsKey(new Point(1,1)) 
assert map.containsKey(new Point(2,2)) 
assert !map.containsKey(new Point(3,3)) 
+0

Ihre Java-Version funktioniert auch nicht. Siehe [hier] (https://ideone.com/hUsD2H). – Ironcache

Antwort

5

Sie benötigen einen equals und hashCode Methode auf Ihrer Point Klasse haben, so dass die Instanzen als Schlüssel in der HashMap

gefunden werden können Sie tun können dies schnell durch Hinzufügen einer Annotation in Groovy:

+0

Warum funktioniert es dann in Java? – Guillaume

+0

Es tut es nicht. Du brauchst 'equals()' und 'hashCode()' auch dort. Deshalb wirft Ihr Java-Code 'RuntimeException: kann keinen neuen Schlüssel (0,0) in der Karte finden'. – Andreas

+0

Andreas hat recht; Der angegebene Java-Code erstellt eine kompromittierte Map (wie in der [Beispielausgabe] (https://ideone.com/hUsD2H) gezeigt, die ich in meinem Kommentar zu der Frage angegeben habe). Das ist die richtige Antwort. – Ironcache