class SinglyLinkedList extends AbstractList {
protected Node first;
protected Node last;
protected int size;
static class Node {
Node next;
Object val;
Node(Node next, Object val) {
this.next = next;
this.val = val;
}
Node() {
this.next = null;
this.val = null;
}
}
Я собираюсь от односвязного списка унаследовать двусвязный список, при этом в вложенном классе, который будет находиться в DoublyLinkedList должно быть ещё одно поле и соответственно конструктор.
public class DoublyLinkedList extends SinglyLinkedList {
static class Node extends SinglyLinkedList.Node {
Node prev;
Node(Node next, Object val, Node prev) {
super(next, val);
this.prev = prev;
}
}
Уверен, что делаю это не правильно.
Ответ
Правильно будет вынести общую логику списков в абстрактный класс и унаследовать от него оба списка. Если Node хранит только состояние, то пусть он будет отличаться в реализациях списка. Либо его можно вынести в protected / package-private классы, для того чтобы была видимость только внутри пакета.
Статические внутренние классы не нарушают SOLID, с их помощью обычно выполняют логическую группировку сущностей внутри класса. В вашем случае плохо то, что вы усложняете дизайн, что сопряжено в последующей тестируемостью и расширяемостью кода, не извлекая при этом никакой практической пользы.
Примеры из JDK:
AbstractSequentialList
LinkedList
Комментариев нет:
Отправить комментарий