Java继承LinkedList实现SortedLinkedList时无法访问私有Node问题
嘿,刚入门Java就自己实现链表和有序链表,这动手能力必须点个赞!遇到的这个私有成员访问问题其实是Java封装特性的典型场景——私有成员(private)只能被定义它的类本身访问,子类哪怕继承了父类也没法直接碰。咱们有几个靠谱的解决方案,你可以根据自己的需求选:
方案1:调整访问权限为protected
把LinkedList里的Node类和start成员的修饰符从private改成protected。这样一来,子类SortedLinkedList就能直接访问这些成员了,代码改动最小:
// 在LinkedList中修改 protected class Node { // 节点的属性和方法 } protected Node start;
不过要注意:protected允许同包下的其他类也访问这些成员,要是你很在意封装的严谨性,这个方案可能不是最优选择。
方案2:在LinkedList中提供protected的访问方法
保持原有封装(成员还是private),在LinkedList里添加专门给子类用的protected方法,让SortedLinkedList通过这些方法间接操作start节点。比如:
// 在LinkedList中添加 protected Node getStartNode() { return start; } protected void setStartNode(Node newStart) { this.start = newStart; }
然后在SortedLinkedList里,你就可以通过super.getStartNode()来获取头节点,用super.setStartNode(...)来更新头节点,既保留了LinkedList的封装性,又满足了子类的需求。如果需要操作其他节点,还可以按需添加类似的protected方法,比如getNextNode(Node current)之类的。
方案3:用组合代替继承(更推荐的设计方式)
其实从设计原则来说,有序链表和普通链表的关系不一定是“is-a”(继承的核心逻辑),反而更适合用“has-a”的组合关系:让SortedLinkedList内部持有一个LinkedList实例,自己实现有序插入的逻辑,其他方法直接委托给内部的LinkedList。这样完全避开了访问权限问题,还能降低类之间的耦合度:
public class SortedLinkedList<T extends Comparable<T>> implements List<T> { private LinkedList<T> innerList = new LinkedList<>(); @Override public void add(T element) { // 这里实现你的有序插入逻辑:找到合适的位置,然后调用innerList的对应方法插入 // 比如先遍历找到第一个比element大的节点,再插入到它前面 } @Override public T get(int index) { return innerList.get(index); } // 其他List接口方法都可以直接委托给innerList实现 }
这个方案的优势在于,你不用受限于LinkedList的内部实现,后续如果要调整SortedLinkedList的逻辑,也不会影响到LinkedList类,更符合面向对象的设计思想。
内容的提问来源于stack exchange,提问作者Siesta

