Страницы

Поиск по вопросам

воскресенье, 2 июня 2019 г.

Наследование с вложенными классами

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

Комментариев нет:

Отправить комментарий