公共属性 VS 具有getter的私有属性?

10

这个问题困扰了我一段时间。是直接访问公共属性还是使用getter方法访问私有属性?哪一个更好/正确,为什么?


2
你是指“字段”,而不是“属性”,对吧? - skaffman
2
我感觉好像这个问题已经被问过了。 - Woot4Moo
5个回答

8
直接暴露字段被认为是一种不好的做法。
最好将字段保持为私有,并仅公开getter和setter。其中一个优点是可以为getter和setter选择不同的访问级别,而字段仅具有单个访问级别。使用getter的另一个优点是允许更改实现而不更改类接口。
更好的方法是在可能的情况下避免使用getter和setter。而是使用封装更高级别行为的方法。这是因为对象不应该通过直接访问字段或间接通过getter和setter来篡改其他对象的内部状态。
相关链接:
- 获取器和设置器是否是糟糕的设计?看到了矛盾的建议

7

使用getter(和可能的setter)的私有属性被认为是合适的风格,因为声明为public并直接使用会破坏封装原则。它可能会导致的问题之一是,您直接依赖于字段的实现类型,如果以后需要更改,则更难。

此外,getter/setter允许您向访问和修改过程添加逻辑。您可以执行边界检查、输入验证、将null替换为默认值等操作...

然而,在许多情况下,例如大多数JavaBeans用法,getter/setter仅做您直接访问所需的工作。因此,在JavaBeans上下文中,这整个事情都是受争议的。

我的意见?整个问题被严重夸大了,它引发的讨论已经花费了足够的时间和键盘击键,创造了一个具有适当属性的全新Java语言规范。不要听信教条,做最适合您的事情,并始终思考什么是有意义的,什么是没有意义的。如果每个人都接受上述话语,我们可能仍然在汇编中编码。


我同意。将你的类/接口设为私有,然后随心所欲地使用它们。只有在需要公开它们时才需要担心这些事情。 - emory

1

始终将字段声明为私有。假设您有一个银行账户,您想取一些现金:

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);

但是在这里,你可以画一百万美元的图案 ;)


2
我不想在一个新的垃圾回收银行账户上欠下100万美元的债务。 - Robert

1
通常情况下,我们更倾向于使用getter而不是公共字段,因为将字段设为私有并暴露getter可以防止调用者修改字段,并且允许您稍后更改实现而不更改接口。
这个规则的一个例外是逻辑常量,人们通常更喜欢使用公共静态final字段:Days.SATURDAY 而不是 days.getSaturday()。但是,如果该值附加到特定实例而不是类,或者可能会发生变化,或者通常不像必须是通用常量,那么由私有字段/公共getter提供的灵活性使其更可取。

0
保持字段私有可以防止其他类修改您的对象,想象一个继承模型,子类可以操作其父类的字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接