封装如何在链接列表中工作

时间:2014-05-01 04:09:58

标签: java data-structures linked-list encapsulation

假设我有两个课程ListNodeList

public class List{
    private ListNode head;
    public List(){head = null;}
    public void insertFront (int obj)
    {
        head = new ListNode(obj, head);
    }
    // other methods to be declared
    public boolean isEmpty(){...}
    public Object removeFront() {...}
    public Object removeBack(){...}
    public void insertBack(Object value){...}
    public ListNode nth(int i){...}
    public void insertAfter(ListNode node, Object value){...}
}  

public class ListNode{
    public Object item;
    public ListNode next;
    public ListNode(Object value,ListNode next){
        this.item = value;
        this.next=next;
    }
    public ListNode(Object value){
        this(value,null);
    }
}  

在我看过的视频中,它说没有List的方法返回ListNode,因此单个节点不能被篡改。外部课程无法获得列表中Node的引用 这是否意味着我创建一个列表

List list=new List();
list.insertFront("a");
list.insertFront("b");
list.insertFront("c");

此特定列表无法由外部类更改。但是外部类仍然可以创建单独的链表吗?

public class A{
    public static void main (String args[]){
        ListNode list=new ListNode("a");
        System.out.println(list.item);  
    }
}

有没有办法可以在课堂A上访问课程List中创建的项目? 有人可以解释封装如何工作,因为我不熟悉Java和编程,我仍然试图理解封装的概念。

2 个答案:

答案 0 :(得分:3)

您可以在List类中定义ListNode类,而不是创建两个不同的类。这样,您将隐藏使用ListNode类的内部表示。

此外,链表支持的基本API是

  

public void addItem(int val);

     

public void removeItem(int val)

     

public int size()

list.insertFront()可以在列表类中轻松实现。列表类将有一个字段“head”,它将是链表的头部。因此,要在链接列表的前面插入节点,您所要做的就是更改链接列表的头部。现在没有必要将头引用传递给调用类。

removeFront,removeBack等可以类似地实现。

但是,如果要删除链接列表中的特定节点,则必须更改API和实现。即,我们没有添加从链表中删除特定节点的功能。当前的remove方法将int值作为参数,而不是Node类的对象。

您可以在Java here中找到双向链表类的实现。我觉得这个实现是可靠的,因为这个实现是由普林斯顿大学的教授教授的。

答案 1 :(得分:0)

在尝试使用java来理解封装之前,您应该阅读Java中的访问修饰符。

如果将变量标记为公共变量,则始终可以访问任何对象。然而,这是一种不好的做法。您的对象应始终是私有或受保护的。

由于您将ListNode元素标记为私有,因此除了ListNode类/对象之外的任何地方都无法访问它,除非您有一个返回该引用的泄漏函数(这是错误的代码)

对于Ex: 公共类列表{     private ListNode internalListNode;     ....     public ListNode badLeakyRef(){       return internalListNode;     } }