这个问题困扰了我一段时间。可以直接进入的公共财产还是带有吸气剂的私人财产?哪一个更好/更正,为什么?
答案 0 :(得分:7)
直接暴露字段被认为是一种不好的做法。
最好将字段保持为私有,并且只显示getter和setter。一个优点是您可以为getter和setter选择不同的访问级别,而一个字段只有一个访问级别。使用getter的另一个好处是它允许您在不改变类接口的情况下更改实现。
更好的方法是尽可能避免吸气剂和固定剂。而是使用封装更高级别行为的方法。这是因为对象不应该篡改其他对象的内部状态(通过直接访问字段,或间接通过getter和setter)。
相关
答案 1 :(得分:4)
具有getter(以及可能的setter)的私有属性被认为是正确的样式,因为将它们公开并直接使用它们会损害封装原则。它可能导致的一个问题是你直接依赖于字段的实现类型,如果需要的话就更难以改变。
此外,getter / setter允许您为访问和变异的过程添加逻辑。您可以执行边界检查,输入验证,用默认值替换空值...
然后,在许多情况下,像大多数JavaBeans一样,getter / setter只会执行直接访问所做的事情。所以这整个事情在JavaBeans环境中都有争议。
我的意见?整个问题被严重夸大了,它引发的讨论量已经耗费了足够的时间和键盘敲击来创建一个具有适当属性的全新Java语言规范。不要听从教条,做最适合你的事情,永远不要停止思考什么是有意义的,什么是没有意义的。如果每个人都接受了上面的话,我们可能仍然会在汇编中编码。
答案 2 :(得分:1)
通常,首选使用getter而不是public字段,因为将字段设为私有并公开getter会阻止调用者修改字段,并允许您稍后更改实现而不更改接口。
此规则的一个例外是逻辑常量,人们通常更喜欢公共静态最终字段:Days.SATURDAY
而不是days.getSaturday()
。但是如果值附加到特定实例而不是类,或者可能永远不会改变,或者通常不认为它必须是一个通用常量,那么私有字段/公共getter提供的灵活性使它更可取。
答案 3 :(得分:0)
保持字段私有可防止其他类修改您的对象,可以考虑一个子项可以操作其父字段的继承模型。
答案 4 :(得分:0)
请务必将字段声明为私有字段。假设您有一个银行账户并且想要提取一些现金:
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万美元;)