如何使用列表的最终实例设计链表

How to design a linked list with a final instance of the list

我正在训练我的 Java 技能,目前正在研究我自己的链表实现。在这里,我想创建一个链表,您不能在其中添加或删除列表项。不幸的是我仍然能够添加 Listitems。

那么当我想制作 List 的最终实例时,我应该如何设计这些 类。

public class ListElement {
    private int data;
    private ListElement nextElement;
}

public class List {
    private ListElement first = null;

    public List() {
        first = null;
    }
    public static List randomList(int numListElements) {
        List list = new List();
        for(int i = 0; i < numListElements; i++)
        {
            list.add((int) ((Math.random() * 100) + 1));
        }
        return list;
    }
    public void add(int d1) {
        if(first == null)
        {
            first= new ListElement(d1);
            return;
        }
        ListElement currentLink = first;
        while(currentLink.getNextElement() != null)
        {
            currentLink = currentLink.getNextElement();
        }
        currentLink.setNextElement(new ListElement(d1));
    }
}

public class Listentest {
    public static void main(String[] args) {
        final List list = List.randomList(3);
        System.out.println(list.toString());
        list.add(5);
        System.out.println(list.toString());
    }
}

在第一个输出中我收到了 3 个元素。在第二个输出中,我收到 4 个元素。我希望输出相同..

您将布尔字段添加到列表 class,可能命名为 allowModifications。最初,该字段为 true,但您向 class 添加一个可能称为 seal() 的方法,该方法将该字段更改为 false。

然后所有会更改列表的方法只需检查该字段。如果为真,则他们会做他们应该做的事情,否则他们会抛出异常,告诉用户密封列表不允许修改。

另一种方法是定义节点的特殊实例 class。当调用 seal() 时,列表中的最后一个元素指向该特殊值而不是 null 以标记:不再允许添加其他元素。但是基于该标志的解决方案不那么复杂。

考虑到 OP 的评论:现实世界的解决方案的工作方式不同:您基本上一直都有允许修改的列表。然后你是一个单独的列表植入,在其初始创建后无法修改。您基于另一个列表创建该列表,它获取其中的元素,然后简单地拒绝任何类型的修改。

不,列表 class 无法知道它自己的实例是否被标记为最终的!

一种可能性是创建一个单独的 class 来创建 unmodifiable 列表。您将原始列表传递给构造函数,它 returns 一个不包含 add 方法但仍允许您列出项目的新列表。

这样做的一个好处是,如果您需要创建第二个或第三个包含其他项目的列表,您可以将它们添加到原始列表中,然后创建一个新的 unmodifiable 列表。