Я перечитывал Effective Java (2nd edition), пункт 18, предпочел интерфейсы абстрактным классам . В этом пункте Джош Блох приводит пример скелетной реализации интерфейса Map.Entry<K,V>
:
// Skeletal Implementation
public abstract class AbstractMapEntry<K,V>
implements Map.Entry<K,V> {
// Primitive operations
public abstract K getKey();
public abstract V getValue();
// ... remainder omitted
}
Из этого примера вытекают два вопроса:
- Почему getKey и getValue явно объявлены здесь как абстрактные методы? Они являются частью интерфейса Map.Entry , поэтому я не вижу причины для избыточного объявления в абстрактном классе.
Зачем использовать идиому оставления этих примитивных методов, как их называет мистер Блох, как абстрактных? Почему бы просто не сделать это:
// Скелетная реализация
открытый абстрактный класс AbstractMapEntry
реализует Map.Entry {
закрытый ключ K;
частное значение V;
// Primitive operations
public K getKey() {return key;}
public V getValue() {return value;}
// ... remainder omitted
}
Преимущества этого состоят в том, что каждый подкласс не должен определять свой собственный набор полей и может по-прежнему получать доступ к ключу и значению посредством своих методов доступа. Если подкласс действительно должен определить свое собственное поведение для методов доступа, он может напрямую реализовать интерфейс Map.Entry. Другим недостатком является то, что в методе equals, предоставляемом скелетной реализацией, абстрактные методы доступа называются:
// Implements the general contract of Map.Entry.equals
@Override public boolean equals(Object o) {
if (o == this)
return true;
if (! (o instanceof Map.Entry))
return false;
Map.Entry<?,?> arg = (Map.Entry) o;
return equals(getKey(), arg.getKey()) &&
equals(getValue(), arg.getValue());
}
Bloch предостерегает от вызова переопределяемых методов (пункт 17) из классов, предназначенных для наследования, поскольку он оставляет суперкласс уязвимым для изменений, вносимых подклассами.
Может быть, это вопрос мнения, но я надеялся определить, есть ли что-то еще в этой истории, поскольку Блох в действительности не уточняет это в книге.