我参加了一个工作面试。面试官问我为什么需要私有变量。如果您通过定义一个私有变量来实现某些目标,那么您不能通过定义 java 中定义的任何其他访问修饰符来实现相同的目标吗?
根据 Java 规范语言, 私有类成员或构造函数只能在 包含成员或构造函数声明的顶级类 (7.6)。 它不被子类继承。
但是,如果我正在设计一个类,我该如何决定定义一个变量“私有”?
我参加了一个工作面试。面试官问我为什么需要私有变量。如果您通过定义一个私有变量来实现某些目标,那么您不能通过定义 java 中定义的任何其他访问修饰符来实现相同的目标吗?
根据 Java 规范语言, 私有类成员或构造函数只能在 包含成员或构造函数声明的顶级类 (7.6)。 它不被子类继承。
但是,如果我正在设计一个类,我该如何决定定义一个变量“私有”?
通过限制“其他代码”(可能由其他人编写/维护)的访问,您将来可以更自由地更改它,而不必担心破坏依赖它的其他代码。
问题不是“我应该将此设为私有吗?”,而是“是否需要将其设为非私有?”。是否有一些其他代码可能需要访问该变量?
如果事实证明是这样,您分配适当的访问权限(可能通过 getter/setter)并接受对其进行更改将很困难。否则,您将其保密。
我认为您应该从另一个方向看待它:为什么要创建一个变量而不是私有变量?适当的封装意味着隐藏您的实现细节,因此默认情况下应该将字段设为私有。
基本上,一旦你做出了一个变量public
,你就已经承诺并且永远不会回头做这个决定。未来的每一次更改都会更改您的类的公共接口,这反过来意味着该类的每次使用都需要更改。对于公共 API,这是不可想象的;您的库有效地破坏了向后兼容性。
即使对于私人使用的课程,这也是一件大事。
那么,将来您何时会将变量的范围更改为private
?这有很多可以想象的原因。最简单的是,每次更改变量的值时,您的班级可能需要做一些事情(例如记录更改,或相应地更新其他变量)。或者您稍后决定根本不需要该变量,而是应该动态计算用户请求的值。
如果您直接读取或设置变量,那是不可能的。相反,您的类需要通过禁止直接访问变量并提供适当的公共 getter/setter 方法来强制用户调用 getter/setter。
因为通常你永远无法预见未来的变化,所以不做变量已成为公认的最佳实践public
。每个变量都应该是private
(或至少是内部的)。
(有一个例外:在某些情况下,final
可以安全地生成变量public
。例如,类似枚举的常量通常public final
在 Java 库中实现为变量,因为它们永远不会改变,并且不需要访问控制,因为它们无论如何都是只读的) .
一般的经验法则是减少变量和方法的范围。你保持私有的东西越多,你就越容易改变你的类,而不会在系统中的其他部分引起问题(即:你减少耦合)。
所以作为一般规则 private 应该是默认的
所以,你必须问自己为什么它必须是私有的。那么,如何通过矛盾的思想来使用真理。
可以公开吗? 如果答案是,您不希望人们能够直接访问和修改该属性,那么它就不能公开。
可以默认吗? 如果答案是,你不希望同一个包能够直接访问和修改属性,那么它不能是默认的。
是否可以保护 如果答案是,你不希望子类直接访问和修改属性,那么它就不能被保护。
因此,如果所有答案都为“否”(并且您必须确定在这些情况下为什么不希望访问的答案),那么它必须是私有的。
问题是问,你真的了解修饰符给你什么,以及如何访问它们,而不是盲目地将所有内容设为私有,并创建 setter 和 getter,因为这是你的讲师/书/手册教给你的。
如果您通过定义一个私有变量来实现某些目标,那么您不能通过定义 java 中定义的任何其他访问修饰符来实现相同的目标吗?
是的。确实如此。Anyprivate
可以更改为public
(或protected
等等),程序将像以前一样编译和运行。
访问修饰符的存在是为了方便程序员,并帮助他正确定义类的接口。看看关于封装的维基百科文章。
在以下情况下,该成员是私有的:
这种设计的对象是封装,这意味着您的类实现对客户端代码隐藏。它提高了代码的可读性、可维护性和可测试性。
类的主要目的是封装数据和行为并隐藏内部实现,同时对外暴露干净、简单和有用的 API。
有两个不同的事情需要考虑:公共合约(API)和私有数据。
私有字段:这是您的私有数据,您不希望将其暴露在外部,因为:安全性和完整性。
私有方法:使代码更具可读性和可维护性的实用函数。
公共方法:您向其他人公开的合同(接口、API)。这就是使您的课程有用的原因。
公共领域:不要使用它。它仅公开您的部分内部数据。对于简单的类可能没问题,而对于具有相互依赖字段的复杂类,这是一个很大的禁忌。要公开功能,您应该使用公共方法(第 3 点)。
其中许多注释适用于内部/嵌套类、方法和构造函数。
基本上,您希望在不造成过度复杂的情况下尽可能限制访问。如果您可以将某些内容设为私有或静态,我建议您这样做。如果您可以将字段定为决赛,这通常也有助于提高清晰度。
当一个字段或任何成员是私有的时,您可以立即看到它在哪里使用以及何时不再使用。