/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.collection.map;

import java.util.Arrays;
import net.ranides.assira.collection.ArrayUtils;

/**
 * <p>
 * Klasa grupująca obiekty, i tworząca na ich podstawie jeden złożony klucz,
 * spełniający kryteria wymagane przez instancje {@link java.util.Map}.
 * </p><p>
 * Uwaga! Klucz nie pozwala na bezpośredni dostęp lub modyfikację składowych, ale
 * jeśli składowe nie są <i>immutable</i>, a referencje do nich zostaną wykorzystane
 * do modyfikacji składowych, to również {@code CompositeKey} natychmiast
 * odwzoruje te zmiany.
 * </p>
 * @author ranides
 */
public class CompositeKey {

    private final Object[] keys;

    /**
     * Tworzy nowy klucz na podstawie podanych wartości.
     * @param keys
     */
    public CompositeKey(Object... keys) {
        this.keys = ArrayUtils.arraycopy(keys);
    }

    @Override
    public boolean equals(Object value) {
        return (value instanceof CompositeKey) && Arrays.equals(keys, ((CompositeKey) value).keys);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(this.keys);
    }

}
