java - 通过 getter 方法改变对象的状态通常被认为是一种不好的做法吗?

标签 java getter-setter object-composition

在我过去的开发过程中,我一直在思考这个问题。

我有点反对做这样的事情,我通常声明一个单独的方法来显式处理逻辑。

例如

如果一个类有一个返回对象列表的方法,我认为直接通过其 getter 方法修改这个集合是一个坏主意。

 Public Class ReportGenerator{

    private List<Configurations> configurations;

    List<Configuration> getConfigurations (){
      return this.configurations;
    }

    }

我认为这样做是不好的做法:

getConfigurations().remove(1); //remove a configuration via a getter

我会使用以下方法:

 Public Class ReportGenerator{

            private List<Configurations> configurations;

          public  List<Configuration> getConfigurations (){
              return Collections.unmodifiableList(this.configurations);
            }


          public void removeConfiguration(int index) //logic explicitly handle the remove
              { 
              this.configurations.remove(index);
            }

          }

但是我想到的另一件事是,如果 Configuration 对象也有 getter 和 setter,那么你就不能通过这样做来阻止其他人

  reportGenerator.getConfigurations().get(0).settTitle("test");

他们仍然可以通过使用 ReportGenerator 的 getter 方法来更改 Configuration 对象的状态,我认为它不应该允许这样做。但如果我们想防止这种情况发生,我们就必须在 ReportGenerator 类中声明更多方法来将调用转发给 Configuration 对象,并使用防御性复制。

所以我的问题是,如果你有一个对象 A,其中包含另一个使用组合的对象 B,并且它们都有 getter 和 setter,你是否更喜欢通过 A 的 getter 方法更改对象 B 的状态? 例如

A.getB().setTitle("");

或者您更喜欢向 A 添加方法来更改 B 的状态(基本上是将调用转发给 B)

例如

A.setBTitle("");

在此方法内部,A 调用 B.setTitle("");

抱歉这个问题很长,我想我不太确定我到底想问什么。希望你能理解。 :P

最佳答案

这可能适用于较小的类,但我会对如何维护更复杂的对象层次结构感到不寒而栗。想象一下如果 A突然有几个对象作为字段。你认为在每个东西周围都贴上 wrapper 是个好主意吗?然后当每个对象变得更加复杂时考虑这样做。有时做A.getB().getC().setThingamabob()比写A.setSomething()更容易调用 B.setCField()调用 C.setThingamabob() .

如果您认为对象不应该是可变的,请删除 setter 。如果 A 的消费者不需要改变B根本不提供getB()方法,而是提供类似于 A.setThingy() 的内容,其中没有提到正在设置的任何内容都是 B 的一部分。

您的 API 契约并不一定意味着您的类必须为其所有属性提供 getter/setter。如果属性不打算由消费者直接读取/修改,则不要提供这样做的方法。

关于java - 通过 getter 方法改变对象的状态通常被认为是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16631417/

相关文章:

java - 判断一个数字是否是 Java 中的输入?

python - 是否建议使用返回值与 setter 设置的值不同的 getter?

java - 如何指定抽象父字段的子类

java - 如何为字段编写自定义注释,以便为该字段创建自定义 setter ?

python - 使用继承重构一个巨大的Python类来进行组合

Java - 为什么 ClassName.this.variable 在变量为静态时起作用?

java - 玩! framework bootstrap(Fixtures.loadModels ("initial-data.yaml)), injecting "random"模型 setter 中的字符串值

java - 使用 JSTL 集分配整数值

java - 从 Eclipse 运行 Jboss EAP 6.3 时出错?

asp.net-mvc - 在 ASP.NET MVC3 项目中组合多态对象