OptionImpl.java

package space.sunqian.fs.base.option;

import space.sunqian.annotation.Nonnull;
import space.sunqian.annotation.Nullable;

import java.util.Objects;

final class OptionImpl<K, V> implements Option<K, V> {

    static final @Nonnull Option<?, ?> @Nonnull [] EMPTY_OPTIONS = new Option<?, ?>[0];

    private final @Nonnull K key;
    private final @Nullable V value;

    OptionImpl(@Nonnull K key, @Nullable V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public @Nonnull K key() {
        return key;
    }

    @Override
    public @Nullable V value() {
        return value;
    }

    @Override
    public boolean equals(@Nullable Object object) {
        if (!(object instanceof Option)) {
            return false;
        }
        @SuppressWarnings("PatternVariableCanBeUsed")
        Option<?, ?> other = (Option<?, ?>) object;
        return Objects.equals(key, other.key()) && Objects.equals(value, other.value());
    }

    @Override
    public int hashCode() {
        return Objects.hash(key, value);
    }

    @Override
    public @Nonnull String toString() {
        return "[" + key + ": " + value + "]";
    }
}