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