2015-05-21 7 views
9

ich wie Java 7+ Art des Schreibens hashCode() Methode wirklich:Wie verwende ich Java 7+ 'Objects.hash()' mit Arrays?

@Override 
public int hashCode() { 
    Objects.hash(field1, field2); 
} 

Es ist nicht richtig, obwohl mit Arrays arbeiten. Der folgende Code:

@Override 
public int hashCode() { 
    Objects.hash(field1, field2, array1, array2); 
} 

wird nicht funktionieren, wie für array1 und array2 regelmäßige hashCode() statt Arrays.hashCode() würde aufgerufen werden.

Wie kann ich mit Arrays in geeigneter Weise verwenden?

+2

Sie wahrscheinlich muss 'Arrays.deepHashCode' verwenden. –

+1

@LouisWasserman - können Sie erläutern, warum muss ich ** Deep ** Hash Code verwenden? –

Antwort

5

Sie könnten versuchen:

Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2)); 

Dies ist das gleiche wie ein Array erstellen, die field1, field2, deren Inhalt array1 und der Inhalt von array2 enthält. Berechne dann Arrays.hashCode auf diesem Array.

4

Arrays.deepHashCode entdecken Arrays im Array (über instanceof Object[]) und rekursiv selbst aufrufen. Siehe code.

Wenn das Array andere Arrays als Elemente enthält, basiert der Hash-Code auf dem Inhalt und so fort ad infinitum.

@Override 
public int hashCode() { 
    Object[] fields = {field1, field2, array1, array2}; 
    return Arrays.deepHashCode(fields); 
} 

Es wäre nützlich, eine params Version wie Objects.hash zu haben, aber man müßte Ihre eigene schreiben:

public final class HashUtils { 
    private HashUtils(){} 

    public static int deepHashCode(Object... fields) { 
     return Arrays.deepHashCode(fields); 
    } 
} 

Verbrauch:

@Override 
public int hashCode() { 
    return HashUtils.deepHashCode(field1, field2, array1, array2); 
}