【问题标题】:How to design a linked list with a final instance of the list如何设计带有最终列表实例的链表
【发布时间】:2019-11-04 23:40:31
【问题描述】:

我正在训练我的 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 个元素。我希望输出相同..

【问题讨论】:

  • final 关键字使引用本身不可更改。不是参考的内部项目是不可更改的。

标签: java list aggregation final


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这是解决问题的好方法。但是这个问题没有“面向对象”的解决方案吗?关于 allowModifications 解决方法:有没有办法检查我要创建的实例是否是最终的?
  • @Fleet23 我不认为这是一种解决方法。对于您的问题,请参阅我的答案的更新。
  • 啊谢谢我明白了。正如我想了一下,这是一个非常优雅的解决方案。虽然这个解决方案有一个小缺陷:我仍然无法更改 ListElements 但这对我来说现在还可以。再次感谢哥们!
  • @Fleet23 如果你喜欢他的回答,那么你也应该接受。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 2015-12-15
    • 2019-10-09
    • 2019-07-26
    • 2017-06-18
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多