使用私人关键字

2022-09-02 05:29:50

我是编程新手。我现在正在学习Java,有些东西我不太确定,那就是使用私有。为什么程序员将变量设置为私有,然后编写,getter和setter来访问它。为什么不把所有东西都放在公共场合,因为我们无论如何都会使用它。

public class BadOO {
    public int size;

    public int weight;
    ...
}

public class ExploitBadOO {
    public static void main (String [] args) {
        BadOO b = new BadOO();
        b.size = -5; // Legal but bad!!
    }
}

我发现了一些这样的代码,我看到评论合法但很糟糕。我不明白为什么,请解释一下。


答案 1

最重要的原因是隐藏类的内部实现细节。如果阻止程序员依赖这些详细信息,则可以安全地修改实现,而不必担心会破坏使用该类的现有代码。

因此,通过将字段声明为私有,可以防止用户直接访问变量。通过提供 gettter 和 setters,您可以精确控制用户控制变量的方式。


答案 2

首先不公开变量的主要原因是,如果你把它公开了,你以后会制造更多的麻烦。

例如,一个程序员围绕私有成员变量编写公共 getter 和 setter。三个月后,他需要验证变量是否从未“设置”为 null。他在“setFoo(...)”方法中添加了一个检查,然后所有设置变量的尝试都将被检查为“将其设置为null”。案件结案,毫不费力。

另一位程序员意识到,在私有成员变量周围放置公共 getter 和 setter 违反了封装的精神,他看到了这些方法的徒劳,并决定只公开成员变量。也许这可以获得一点性能提升,或者程序员只是想“在使用它时编写它”。三个月后,他需要验证变量是否从未“设置”为 null。他扫描对变量的每个访问,有效地搜索整个代码库,包括可能通过反射访问变量的所有代码。这包括所有扩展了他的代码的第三方库,以及所有在编写后使用他的代码的新编写模块。然后,他修改所有调用,以确保变量永远不会设置为 null。该案例永远不会关闭,因为他无法有效地找到对暴露成员的所有访问权限,也无法访问所有第三方源代码。由于对新编写的模块的了解不完善,调查肯定会不完整。最后,他无法控制可以访问公共成员的未来代码,并且该代码可能包含将成员变量设置为 null 的行。

当然,第二个程序员可以通过在变量周围放置“get”和“set”方法来破坏所有现有的代码,并将其设为私有,但是嘿,他可以在三个月前完成这项工作,并为自己解释为什么需要破坏其他人的代码。

随便你怎么称呼它,但是将公共的“get”和“set”方法放在私有成员变量周围是防御性编程,这是由多年(即几十年)的经验带来的。