/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package java.util;

/**
 * <strong>Note: Do not use this class since it is obsolete. Please use the
 * {@link Map} interface for new implementations.</strong>
 * <p>
 * Dictionary is an abstract class which is the superclass of all classes that
 * associate keys with values, such as {@code Hashtable}.
 * 
 * @see Hashtable
 * @since Android 1.0
 */
public abstract class Dictionary<K,V> {

    /**
     * Constructs a new instance of this class.
     * 
     * @since Android 1.0
     */
    public Dictionary() {
        super();
    }

    /**
     * Returns an enumeration on the elements of this dictionary.
     * 
     * @return an enumeration of the values of this dictionary.
     * @see #keys
     * @see #size
     * @see Enumeration
     * @since Android 1.0
     */
    public abstract Enumeration<V> elements();

    /**
     * Returns the value which is associated with {@code key}.
     * 
     * @param key
     *            the key of the value returned.
     * @return the value associated with {@code key}, or {@code null} if the
     *         specified key does not exist.
     * @see #put
     * @since Android 1.0
     */
    public abstract V get(Object key);

    /**
     * Returns true if this dictionary has no key/value pairs.
     * 
     * @return {@code true} if this dictionary has no key/value pairs,
     *         {@code false} otherwise.
     * @see #size
     * @since Android 1.0
     */
    public abstract boolean isEmpty();

    /**
     * Returns an enumeration on the keys of this dictionary.
     * 
     * @return an enumeration of the keys of this dictionary.
     * @see #elements
     * @see #size
     * @see Enumeration
     * @since Android 1.0
     */
    public abstract Enumeration<K> keys();

    /**
     * Associate {@code key} with {@code value} in this dictionary. If {@code
     * key} exists in the dictionary before this call, the old value in the
     * dictionary is replaced by {@code value}.
     * 
     * @param key
     *            the key to add.
     * @param value
     *            the value to add.
     * @return the old value previously associated with {@code key} or {@code
     *         null} if {@code key} is new to the dictionary.
     * @see #elements
     * @see #get
     * @see #keys
     * @since Android 1.0
     */
    public abstract V put(K key, V value);

    /**
     * Removes the key/value pair with the specified {@code key} from this
     * dictionary.
     * 
     * @param key
     *            the key to remove.
     * @return the associated value before the deletion or {@code null} if
     *         {@code key} was not known to this dictionary.
     * @see #get
     * @see #put
     * @since Android 1.0
     */
    public abstract V remove(Object key);

    /**
     * Returns the number of key/value pairs in this dictionary.
     * 
     * @return the number of key/value pairs in this dictionary.
     * @see #elements
     * @see #keys
     * @since Android 1.0
     */
    public abstract int size();
}
