公共财产VS带吸气剂的私人财产?

这个问题困扰了我一段时间。 可以直接进入的公共财产还是带有吸气剂的私人财产? 哪一个更好/更正,为什么?

直接暴露领域被认为是一种不好的做法。

最好保持字段为私有,只暴露getter和setter。 一个优点是您可以为getter和setter选择不同的访问级别,而一个字段只有一个访问级别。 使用getter的另一个好处是它允许您在不更改类接口的情况下更改实现。

更好的是尽可能避免吸气剂和固定剂。 而是使用封装更高级别行为的方法。 这是因为对象不应该篡改其他对象的内部状态(通过直接访问字段,或间接通过getter和setter)。

有关

  • 吸气剂和二传手设计不佳吗? 看到矛盾的建议

具有getter(以及可能的setter)的私有属性被认为是合适的样式,因为将它们声明为公开并直接使用它们会损害封装原则。 它可能导致的一个问题是您直接依赖于字段的实现类型,如果需要应该更难以在以后更改。

此外,getter / setter允许您为访问和变异过程添加逻辑。 您可以执行边界检查,输入validation,用默认值替换空值…

然后,在许多情况下,像大多数JavaBeans一样,getter / setter只会做你直接访问所做的事情。 因此,整个事情在JavaBeans上下文中都有争议。

我的想法? 整个问题被严重夸大了,它引发的讨论量已经耗费了足够的时间和键盘敲击来创建一个具有适当属性的全新Java语言规范。 不要听从教条,做最适合你的事情,永远不要停止思考什么是有意义的,什么是没有意义的。 如果每个人都接受了上面的话,我们可能仍然会在汇编中编码。

通常,首选使用getter而不是public字段,因为将字段设为私有并公开getter会阻止调用者修改字段,并允许您稍后更改实现而不更改接口。

此规则的一个例外是逻辑常量,人们通常更喜欢公共静态最终字段: Days.SATURDAY而不是days.getSaturday() 。 但是,如果值附加到特定实例而不是类,或者可能永远不会改变,或者通常不认为它必须是通用常量,则私有字段/公共getter提供的灵活性使其更受欢迎。

保持字段私有可防止其他类修改您的对象,可以考虑子项可以操作其父项字段的inheritance模型。

尝试始终将字段声明为私有。 假设您有一个银行帐户并且想要提取一些现金:

 public class BankAccountWithprivateField { private Cash cash; // ... public void draw(int amount) { if(amount <= balance) cash.draw(amount); else sentMessage("Sorry your balance is less than what you request!"); } } // ... new BankAccountWithprivateField().draw(500); 

在这里,你不能画出比你余额更多的东西。

 public class BankAccountWithPublicField { public Cash cash; // ... } // ... new BankAccountWithPublicField().cash.draw(1000000); 

但在这里,你可以挣100万美元;)