Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 公共财产VS私人财产与getter?_Java_Properties_Private_Public_Getter - Fatal编程技术网

Java 公共财产VS私人财产与getter?

Java 公共财产VS私人财产与getter?,java,properties,private,public,getter,Java,Properties,Private,Public,Getter,这个问题困扰了我一段时间。可以直接访问的公共属性还是使用getter访问的私有属性?哪一个更好/正确,为什么?直接暴露字段被认为是一种不好的做法 最好将字段保持私有,只公开getter和setter。一个优点是,您可以为getter和setter选择不同的访问级别,而字段只有一个访问级别。使用getter的另一个优点是,它允许您在不更改类接口的情况下更改实现 更好的办法是尽可能避免使用“能手”和“二传手”。而是使用封装更高级别行为的方法。这是因为对象不应该篡改其他对象的内部状态(通过直接访问字段

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

直接暴露字段被认为是一种不好的做法

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

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

相关的


保持字段私有可以防止其他类修改您的对象,请考虑一种继承模型,在这种模型中,子类可以操作其父类的字段。

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


此规则的一个例外是逻辑常量,对于逻辑常量,人们通常更喜欢公共静态最终字段:
Days.SATURDAY
,而不是
Days.getSaturday()
。但是,如果该值附加到特定实例而不是类,或者可能会更改,或者通常感觉它不一定是一个通用常量,则private field/public getter提供的灵活性使其更可取。

带有getter(可能还有setter)的private属性它们被认为是合适的样式,因为将它们声明为公共的并使用它们直接损害了封装的原则。它可能导致的一个问题是,您直接依赖于字段的实现类型,这使得以后在需要时更难进行更改

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

同样,在许多情况下,与大多数JavaBeans的使用一样,getter/setter所做的只是直接访问。所以这整个事情在JavaBeans上下文中是有争议的


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

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

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

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

你的意思是“领域”,而不是“属性”,我想?我觉得好像以前有人问过这个问题。我同意。将类/接口设置为私有,并对它们执行任何操作。只有在你需要公开的时候才担心这些东西。我不想在一个新的垃圾银行账户上欠下100万美元的债。
public class BankAccountWithPublicField
{
    public Cash cash;

    // ...
}

// ...

new BankAccountWithPublicField().cash.draw(1000000);