Класс abstract
- класс, который реализует большую часть функциональных возможностей объекта, но оставляет для вас важнейшую функциональность.
Когда будет предложено (или даже ожидается), что будут реализованы реализации интерфейса, обычно предоставляется вся необходимая помощь для этого. Здесь чрезвычайно полезны классы Abstract...
. Они не только реализуют интерфейс, но и предоставляют минимальный набор методов abstract
, которые вы должны реализовать для достижения этого.
Рассмотрим реализацию списка, который содержит один единственный String
с помощью AbstractList
:
class OneHelloList extends AbstractList<String> implements List<String> {
@Override
public int size() {
return 1;
}
@Override
public String get(int index) {
return "Hello";
}
}
public void test() {
for (String s : new OneHelloList()) {
System.out.println(s);
}
}
Смотрите, как это просто для меня, чтобы достичь полной функциональности в List
с очень небольшой код базы.
Контраст, что с тем, что я должен сделать, чтобы implement List
без AbstractList
:
class TwoHellosList implements List<String> {
@Override
public int size() {
return 2;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return o.toString().equals("Hello");
}
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
int count = 0;
@Override
public boolean hasNext() {
return count < 2;
}
@Override
public String next() {
count += 1;
return "Hello";
}
};
}
// The rest for you to complete.
@Override
public Object[] toArray() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public <T> T[] toArray(T[] a) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean add(String e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean remove(Object o) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean containsAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean addAll(Collection<? extends String> c) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean removeAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void clear() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String get(int index) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String set(int index, String element) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void add(int index, String element) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String remove(int index) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int indexOf(Object o) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int lastIndexOf(Object o) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public ListIterator<String> listIterator() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public ListIterator<String> listIterator(int index) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public List<String> subList(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
не все абстрактные классы содержат (не абстрактные) методы. в некоторых случаях это просто выбор дизайна. например, «Я хочу, чтобы подклассы не расширили какой-либо другой класс» – Stultuske
В Java 8 есть меньше причин использовать абстрактные классы, так как интерфейс теперь может иметь код с методами 'default' и' static'. То, что раньше требовалось для абстрактного класса, может потребовать только интерфейса (интерфейсов). –