gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:34:01 25 4
gpt4 key购买 nike

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

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

例如

如果一个类有一个返回对象列表的方法,我认为直接通过其 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com