Почему AbstractQueue и AbstractList разделены? - PullRequest
3 голосов
/ 20 мая 2010

В дни обучения C, когда я реализовал Queue, я реализовал их поверх LinkedList. По сути, у меня было два указателя (передний и задний) для операций Queue поверх LinkedList, или лучше один передний указатель поверх CircularLinkedList.

Я изучаю Java Collections Framework и наблюдаю, что дизайн полностью отделил интерфейсы List и Queue, и реализации разветвляются следующим образом -

alt text

Я думаю, AbstractQueue должен был быть подклассом где-то внутри AbstractList. Может быть, не внутри ArrayList, потому что я не хочу произвольного доступа к элементам, но, возможно, внутри AbstractSequentialList, хмм? (Я понимаю, я мог быть совершенно не прав здесь)

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

Это похоже на то, что сделано для гибкости реализации: очередь не должна быть реализована в виде списка (в частности, очередь с приоритетами почти наверняка представляет собой кучу, которая представляет собой гораздо более произвольную структуру доступа, чем список могу предложить).

2 голосов
/ 20 мая 2010

Я думаю, что интерфейсы должны быть непересекающимися, но в методе реализации есть ссылка, как вы определили. Список и очередь концептуально отличаются от потребителя, если рассматривать их как черный ящик, даже если существует связь между тем, как их реализовать, используя связанный список.

1 голос
/ 20 мая 2010

Разве здесь не вступает в действие принцип замещения Лискова ? AbstractQueue НЕ AbstractList, поэтому он не должен наследоваться от него. Однако его реализация может использовать один, но по составу, а не по наследству.

...