Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果树集对象更改其值(树集的最佳实践?),该怎么办?_Java_Treeset - Fatal编程技术网

Java 如果树集对象更改其值(树集的最佳实践?),该怎么办?

Java 如果树集对象更改其值(树集的最佳实践?),该怎么办?,java,treeset,Java,Treeset,我喜欢在操作对象之前将对象添加到列表中,这样我就不会忘记以后添加它,也许我更喜欢在疯狂的扩展逻辑中工作 List list = new ArrayList(); MyObj mine = new MyObj(); list.add(mine); 这是我通常在列表中添加对象的方式 刚才我有一个用例,TreeSet更有意义,所以我自然想做这样的事情:- mine.setXXX(stuff); 但这里的问题是,在将对象添加到列表之前,Treeset需要在compareTo方法中使用变量进行初始化

我喜欢在操作对象之前将对象添加到列表中,这样我就不会忘记以后添加它,也许我更喜欢在疯狂的扩展逻辑中工作

List list = new ArrayList();
MyObj mine = new MyObj();
list.add(mine); 
这是我通常在列表中添加对象的方式

刚才我有一个用例,
TreeSet
更有意义,所以我自然想做这样的事情:-

mine.setXXX(stuff);
但这里的问题是,在将对象添加到列表之前,
Treeset
需要在
compareTo
方法中使用变量进行初始化

好的,我会处理的

但我的担心和问题是:- 有没有一种方法我可以强制那些可能正在使用我的模型的开发人员不要重复我的错误,我已经使用了
Treeset
。i、 e.在将对象添加到集合之前,强制它们初始化
myObject
变量。
尽管开发人员应该知道这一点,并且应该注意这一点,但仍然有办法强制执行或采用一些最佳做法。

很简单:强制字段的值应该在对象的构造函数中传递,并且永远不要提供不包括至少所有强制字段的构造函数。然后您可以在构造函数中设置它们。

不,没有通用的方法来强制执行此操作。最好的方法是将不可变对象仅放在不能修改的集合中。不要在对象上使用
setXXX
方法,而是通过构造函数使其可配置且不可编辑。

。。。让它们成为最后的,理想的。@leoismyname我的荣幸!此外,Jon Skeet的建议是合理的:如果可能的话,将计算散列所涉及的属性标记为
final
,这样就不会意外地修改它们。我的问题稍有不同,我希望有一种机制来强制在初始化compareTo变量后添加对象。虽然在较老的问题中,他们主要讨论如何在每次对象的变量更改时刷新树集。
Set set = new TreeSet();
MyObj mine = new MyObj();
set.add(mine);
mine.setXXX(stuff); // add setters here