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

Is it a bad practice to change the value of an object, bypassing the setter?

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

示例List

getMyListFromPojo().addAll(additionalList);

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

这取决于你想用你的对象实现什么,如果你需要你的对象是不可变的(除了使用提供的一些方法),那么你需要显示该对象的副本(或使其不可变)通过使用 Collections.Immutable 之类的方法)。 回答你的问题:修改方法返回的列表是完全可以的(如果这是你想要的)。

Is it a bad practice to change the value of an object, bypassing the setter?

好的 API 不允许您更改该值。 getMyListFromPojo() 将 return 成为不可修改的集合,外部人员无法更改值 returned。

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

This code will change the value in the field myListFromPojo! Is this a normal practice?

这是您的代码,因此是您的决定。

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

另一方面,如果您希望发生此类更改,那么请在 JavaDoc 中很好地记录下来,然后确保您的 APIs不要让它发生。例如,通过确保 List 实例实际上是某种 ImmutableList。

请注意,两种方式都是合法的。这真的取决于定义 APIs 的人,什么是可以接受的,什么不是。当然,第一个前提是 API 中的所有内容都以相同的方式运行。

除此之外,这样的 DTOs/Beans 通常只包含值,因此通常允许更新它们。但是当然,它 可以 在多个线程发挥作用时导致问题。从一致性的角度来看,您总是最好 forbid 修改(而不是:更改创建具有新内容的新对象)。但有时这样做的性能损失可能被认为太高了。

我会写两个方法:

  • 一个用于将单个对象添加到列表
    public void addToListFromPojo(Object object) {
        this.myListFromPojo.add(object);
    }
  • 还有一个用于向其中添加对象列表的方法
    public void addAllToListOfPojo(List<Object> objectList) {
        this.myListFromPojo.addAll(objectList);
    }

这会产生更多(理论上不必要的)代码,但它会支持可读性和
负责更改 class 中的字段。

If you don't care for responsibilities of units of your code, then just use less code ==> your example