Sha*_*shi 14 java encapsulation private-members
我参加过面试.面试官问我为什么需要私人变量.如果通过定义变量private来实现某些功能,那么通过定义java中定义的任何其他访问修饰符,您是否能够实现相同的目标?
According to Java Specification Languages, A private class member or constructor is accessible only within the body of the top level class (7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.
但是,如果我正在设计一个类,我如何决定定义变量"私有"?
Kri*_*ris 40
通过限制"其他代码"的访问(可能由其他人编写/维护),您可以更自由地在将来更改它,而不必担心会破坏其他依赖它的代码.
问题不是"我应该将其私有化吗?",而是"是否需要将其设为非私人?".是否有一些其他代码可能需要访问变量?
如果情况确实如此,则指定适当的访问权限(可能通过getter/setter)并接受对其进行更改将很困难.否则你把它保密.
基本上,一旦你做出一个变量public,你就会承诺并且永远不会回到这个决定.每个未来的更改都会改变您的类的公共接口,这反过来意味着需要更改该类的每个用法.对于公共API,这是不可想象的; 你的库有效地破坏了向后兼容性.
即使对于私人使用的课程,这也是一件大事.
那么你什么时候才能改变变量的范围private呢?有许多可以想象的原因.最简单的是,每当变量的值发生变化时,您的类可能需要执行某些操作(例如,记录更改,或相应地更新其他变量).或者您稍后决定根本不需要变量,并且应该动态计算用户请求的值.
如果您直接阅读或设置变量,那是不可能的.相反,您的类需要强制用户调用getter/setter,禁止直接访问变量并在其位置提供适当的公共getter/setter方法.
因为一般来说你永远无法预见到这种未来的变化,所以它已成为公认的最佳实践,不做任何变数public.每个变量都应该private(或至少是内部的).
(有一个例外:在某些情况下,final变量可以安全地进行public.例如,类似枚举的常量通常public final在Java库中实现为变量,因为它们永远不会改变,并且不需要访问控制,因为它们是只读的) .
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |