SingletonMap.java
/*******************************************************************************
* Copyright (c) 2013 Stephen F. Siegel, University of Delaware.
*
* This file is part of SARL.
*
* SARL is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* SARL is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with SARL. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package edu.udel.cis.vsl.sarl.util;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import edu.udel.cis.vsl.sarl.IF.SARLInternalException;
public class SingletonMap<K, V> implements Map<K, V> {
private K theKey;
private V theValue;
public SingletonMap(K key, V value) {
assert key != null;
theKey = key;
theValue = value;
}
@Override
public int size() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean containsKey(Object key) {
return theKey.equals(key);
}
@Override
public boolean containsValue(Object value) {
return theValue == null ? (value == null) : theValue.equals(value);
}
@Override
public V get(Object key) {
return theKey.equals(key) ? theValue : null;
}
@Override
public V put(K key, V value) {
throw new SARLInternalException("Map is immutable");
}
@Override
public V remove(Object key) {
throw new SARLInternalException("Map is immutable");
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
throw new SARLInternalException("Map is immutable");
}
@Override
public void clear() {
throw new SARLInternalException("Map is immutable");
}
@Override
public Set<K> keySet() {
return new SingletonSet<K>(theKey);
}
@Override
public Collection<V> values() {
return new SingletonSet<V>(theValue);
}
@Override
public Set<java.util.Map.Entry<K, V>> entrySet() {
return new SingletonSet<Entry<K, V>>(new Entry<K, V>() {
@Override
public K getKey() {
return theKey;
}
@Override
public V getValue() {
return theValue;
}
@Override
public V setValue(V value) {
throw new SARLInternalException("Map is immutable");
}
});
}
@Override
public String toString() {
return "{" + theKey + "=" + theValue + "}";
}
@Override
public int hashCode() {
return theKey.hashCode() + theValue.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o instanceof Map<?, ?>) {
Map<?, ?> that = (Map<?, ?>) o;
if (that.size() != 1)
return false;
else {
Entry<?, ?> thatEntry = that.entrySet().iterator().next();
return theKey.equals(thatEntry.getKey())
&& theValue.equals(thatEntry.getValue());
}
}
return false;
}
}