Java:通过修改作为参数传递的对象来使数据结构无效

时间:2016-04-12 06:53:29

标签: java generics data-structures binary-search-tree avl-tree

我正在研究AVL树的Java通用实现(源代码位于https://github.com/diningphil/AvlTreeJava),我遇到了一个特定问题:如果我传递 insert 方法一个参数 T key ,然后在插入后修改 key 的字段,数据结构已损坏。

我该如何避免这种情况?我可以传递一个对象,要求用户之后不能修改它,而是通过实现我的avl树吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以在插入时克隆密钥。这样,对原始对象的任何更改都不会对插入的对象生效。

答案 1 :(得分:1)

除非数据是不可变的,否则我不知道如何完全避免它,但你可以做一些事情来分离数据。我的意思是:可以使用传入的比较器设置树而不是T extends Comparable<T>

然后客户端可以在插入后修改数据而不破坏树,前提是它只修改了比较器中未使用的字段。这迫使客户思考他想要什么,不想修改并提供一点灵活性。