2015-05-21 22 views
9

Mi piace molto Java 7+ stile di scrittura hashCode() metodo:Come utilizzare Java 7+ 'Objects.hash()' con gli array?

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

Non funziona correttamente con gli array però. Il seguente codice:

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

non funziona, come per array1 e array2 regolare hashCode() invece di Arrays.hashCode() sarebbe invocata.

Come posso utilizzare Objects.hash() con array in modo corretto?

+2

si sarebbe probabilmente usare 'Arrays.deepHashCode'. –

+1

@LouisWasserman - puoi approfondire il motivo per cui ho bisogno di usare il ** codice hash deep **? –

risposta

5

Si potrebbe provare:

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

Questa è la stessa come la creazione di una matrice che contiene field1, field2, il contenuto dei array1 e il contenuto di array2. Quindi calcolare Arrays.hashCode su questo array.

4

Arrays.deepHashCode individuerà gli array nell'array (tramite instanceof Object[]) e chiamerà in modo ricorsivo. Vedere code.

Se la matrice contiene altri array come elementi, il codice hash si basa sul loro contenuto e così via, all'infinito.

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

Sarebbe utile avere una versione params come Objects.hash, ma che avrebbe dovuto scrivere il proprio:

public final class HashUtils { 
    private HashUtils(){} 

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

Usage:

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