Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 绕过setter更改对象的值是一种不好的做法吗?_Java_Oop_Core - Fatal编程技术网

Java 绕过setter更改对象的值是一种不好的做法吗?

Java 绕过setter更改对象的值是一种不好的做法吗?,java,oop,core,Java,Oop,Core,也就是说,我通过get方法获取对象。然后更改值。因此,我不创建此对象的副本,而是更改原始对象的值 带有列表的示例: getMyListFromPojo().addAll(additionalList); 此代码将更改字段myListFromPojo中的值!这是一种正常的做法吗?这取决于你想用你的对象实现什么,如果你需要你的对象是不可变的(除了使用提供的一些方法),那么你需要显示该对象的一个副本(或者使用像Collections.immutable这样的方法使它不可变)。 回答您的问题:修改一个

也就是说,我通过get方法获取对象。然后更改值。因此,我不创建此对象的副本,而是更改原始对象的值

带有
列表的示例

getMyListFromPojo().addAll(additionalList);

此代码将更改字段
myListFromPojo
中的值!这是一种正常的做法吗?

这取决于你想用你的对象实现什么,如果你需要你的对象是不可变的(除了使用提供的一些方法),那么你需要显示该对象的一个副本(或者使用像
Collections.immutable
这样的方法使它不可变)。 回答您的问题:修改一个方法返回的列表(如果这是您想要的)是非常好的

绕过setter更改对象的值是一种不好的做法吗

好的API不允许您更改值
getMyListFromPojo()
将返回不可修改的集合,外部的任何人都无法更改返回的值

另一方面,POJO类应该是一个非常简单的类。我很少看到POJO方法返回比对相应字段的引用更复杂的内容(例如,副本或不可变对象)

此代码将更改myListFromPojo字段中的值!这是正常的做法吗

这是你的代码,因此是你的决定

如果您想允许这样的事情,请在JavaDoc中很好地记录它,并确保底层列表是一个
ArrayList
,例如,它允许任何类型的修改

另一方面,如果您不希望发生这样的更改,那么请在JavaDoc中很好地记录这些更改,以确保您的api不允许它发生。例如,确保列表实例实际上是某种不可变列表

请注意,这两种方法都是合法的。在这里定义API的人实际上决定了什么是可以接受的,什么是不可以接受的。当然,第一个前提是API中的所有东西都以相同的方式运行


除此之外,此类DTO/Bean通常只包含值,因此通常允许更新它们。但当然,当多个线程起作用时,它可能会导致问题。从一致性的角度来看,最好是禁止修改(相反:更改会创建具有新内容的新对象)。但有时这样做的性能损失可能会被认为太高。

我会写两种方法:

  • 一个用于将单个对象添加到列表中
public void addToListFromPojo(对象){
this.myListFromPojo.add(对象);
}
  • 另一个用于向其中添加对象列表
public void addAllToListOfPojo(列表对象列表){
this.myListFromPojo.addAll(objectList);
}
这将导致更多(理论上不必要的)代码,但它将支持可读性和
保留更改类内字段的责任

如果您不关心代码单元的责任,那么只需使用更少的代码==>您的示例


这很好,我个人不喜欢,但它在JavaFX中使用。虽然不违法,但可能不受欢迎。您可以返回一个不可变列表来防止这种情况。guava的
ImmutableList.copyOf()
或java的
Collections.unmodifiableList()
视情况而定。列表是包含对象表示的一部分,还是仅与之关联?如果是前者,表示可能会更改,并且包含的对象可能需要了解状态更改。对答案有何评论?虽然您的问题已结束,但您仍然可以接受其中一个答案!最终,它可能会使类与所有集合的add-remove一起变得混乱methods@AndrewTobilko当然,这只是一个选择的例子,不是一个完美的想法,只是一个保留责任的想法。