在我过去的开发过程中,我一直在思考这个问题。
我有点反对做这样的事情,我通常声明一个单独的方法来显式处理逻辑。
例如
如果一个类有一个返回对象列表的方法,我认为直接通过其 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/