您如何决定定义变量"私有"?

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)并接受对其进行更改将很困难.否则你把它保密.

  • "不是"我应该把这个私有吗?",而是"是否需要这个非私人?".我的想法完全正确 (6认同)

Gar*_*ryF 11

我认为你应该从另一个方向看待它:你为什么要做一个变量而不是私有?正确的封装意味着隐藏实现的细节,因此默认应该是将字段设为私有.


Kon*_*lph 8

基本上,一旦你做出一个变量public,你就会承诺并且永远不会回到这个决定.每个未来的更改都会改变您的类的公共接口,这反过来意味着需要更改该类的每个用法.对于公共API,这是不可想象的; 你的库有效地破坏了向后兼容性.

即使对于私人使用的课程,这也是一件大事.

那么你什么时候才能改变变量的范围private呢?有许多可以想象的原因.最简单的是,每当变量的值发生变化时,您的类可能需要执行某些操作(例如,记录更改,或相应地更新其他变量).或者您稍后决定根本不需要变量,并且应该动态计算用户请求的值.

如果您直接阅读或设置变量,那是不可能的.相反,您的类需要强制用户调用getter/setter,禁止直接访问变量并在其位置提供适当的公共getter/setter方法.

因为一般来说你永远无法预见到这种未来的变化,所以它已成为公认的最佳实践,不做任何变数public.每个变量都应该private(或至少是内部的).

(有一个例外:在某些情况下,final变量可以安全地进行public.例如,类似枚举的常量通常public final在Java库中实现为变量,因为它们永远不会改变,并且不需要访问控制,因为它们是只读的) .


hha*_*fez 7

一般的经验法则是减少变量和方法的范围.你保密的东西越多,就越容易改变你的课程而不会导致系统其他部分出现问题(即:你减少了耦合).

因此,作为一般规则,私人应该是默认的