2014-02-24 8 views
6

Angenommen, ich habe eine Klasse, in der alle Instanzen gleich sind. Ein typischer Anwendungsfall ist für Klassen, die keinen Zustand haben, sondern sich nur als Funktionen verhalten. JetztHashCode-Implementierung für die Klasse, deren Instanzen alle gleich sind

public class ToStringFunction implements Function<Object, String> { 

    @Override 
    public String apply(Object o) { 
     return o.toString(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     return o instanceof ToStringFunction; 
    } 
} 

, wie sollte man eine Methode hashCode implementieren? Natürlich muss es ein konstanter Wert sein, um den equals/hashCode-Vertrag zu erfüllen. Aber welchen Wert sollte das haben? Wenn ein trivialer Wert wie 0 oder 1 verwendet wird, kann dies zu Kollisionen mit anderen ähnlichen Klassen führen.

So scheint es, dass dies auf die Frage läuft: , wie ein Hash-Code, der wahrscheinlich für eine bestimmte Klasse, aber das gleiche für alle seine Instanzen identisch ist zu implementieren.

Ich kam mit diesen beiden Ideen. Was denkst du, sind sie gesund?

@Override 
public int hashCode() { 
    return ToStringFunction.class.hashCode(); 
} 

@Override 
public int hashCode() { 
    return "ToStringFunction".hashCode(); 
} 
+1

Der klassenbasierte Ansatz sieht gut aus für mich ... Aber wofür brauchen Sie equals/hashCode, wenn ich fragen darf? – fge

+0

Ich denke, Sie müssen keine Objekte in einen Satz setzen, wenn sie keinen Zustand haben nur Funktionen. – gyorgyabraham

+0

Ich habe keinen konkreten Anwendungsfall, aber ich nehme an, Sie möchten möglicherweise eine Reihe von Operationen, die Sie auf einige Daten anwenden möchten. Zum Beispiel definiert der JDK Comparator in seiner Schnittstelle equals: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – Natix

Antwort

6

Wenn eine Klasse Staat nicht hat, soll es ein Singleton, eine abstrakte Klasse, oder eine Sammlung von statischen Methoden (wie Math) sein. Daher macht es keinen Sinn, gleichwertige Werte und Hashcode zu überschreiben.

1

Sie könnten einfach die ID der seriellen Version verwenden (in Ganzzahl umwandeln). Das wird eine eindeutige Nummer für jede Klasse sein.

Was Sie versuchen zu tun, macht nicht wirklich viel Sinn, obwohl ohne Kontext mehr zur Verfügung gestellt wird. Wenn diese Objekte zustandslos sind, dann machen Sie sie entweder zu einem Singleton (wenn Sie eine Instanz benötigen, zum Beispiel weil sie sie als Strategien in einem Strategie-Muster verwenden) oder machen Sie alle Methoden statisch, wenn Sie keine Instanz benötigen.

Ich denke, wenn sie Strategien sind alle die gleiche Schnittstelle implementieren sie dann in der Lage zu vergleichen wäre sinnvoll, aber wenn jede Implementierung ist eine Singleton dann der Standard Objectequals und hashCode Methoden werden alles tun, was Sie brauchen.

+0

_... wenn jede Implementierung ein Singleton ist, dann die Standard Object ist gleich und hashCode-Methoden werden alles tun, was Sie brauchen. – Natix

Verwandte Themen