绕过设置器更改对象的值是否是不好的做法?

时间:2019-06-24 13:15:51

标签: java oop core

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

List的示例:

getMyListFromPojo().addAll(additionalList);

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

4 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

  

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

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

如果您愿意,可以在JavaDoc中很好地记录下来,并确保基础List是ArrayList,例如允许进行任何形式的修改。

另一方面,如果您希望进行此类更改,则可以在JavaDoc中很好地记录下来,以确保您的API不允许这种更改发生。例如,通过确保List实例实际上是某种ImmutableList。

请注意,两种方式都是合法的。真正由这里定义API的人员决定什么可以接受,什么不可以。当然,第一个前提是API中的所有事物都以相同的方式运行。

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

答案 3 :(得分:1)

我会写两个方法:

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

这将导致更多(理论上不必要)的代码,但将支持可读性和
承担更改班级内部字段的责任

  

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