2015-05-21 24 views
9

Naprawdę lubię Java 7+ styl pisania hashCode() metody:Jak używać Java 7+ "Objects.hash()" z tablicami?

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

To nie działa poprawnie z tablicami chociaż. Poniższy kod:

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

nie będzie działać, jak array1 i array2 regularne hashCode() zamiast Arrays.hashCode() będzie wywoływany.

Jak mogę prawidłowo używać Objects.hash() z tablicami?

+2

Ty pewnie muszą używać 'Arrays.deepHashCode'. –

+1

@LouisWasserman - czy możesz wyjaśnić, dlaczego muszę użyć ** deep ** hash code? –

Odpowiedz

5

można spróbować:

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

To jest taka sama jak tworząc jedną tablicę, która zawiera field1, field2 zawartość array1 a zawartość array2. Następnie oblicza się Arrays.hashCode w tej macierzy.

4

Arrays.deepHashCode odkryje tablice w tablicy (przez instanceof Object[]) i wywoła się samoczynnie. Zobacz code.

Jeśli tablica zawiera inne tablice jako elementy, kod skrótu oparty jest na ich zawartości itd., Ad infinitum.

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

Dobrze byłoby mieć wersję params jak Objects.hash, ale trzeba napisać własny:

public final class HashUtils { 
    private HashUtils(){} 

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

Zastosowanie:

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