我参加过面试。面试官问我为什么需要私人变量。如果通过定义变量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.
但是,如果我正在设计一个类,我如何决定定义变量“private”?
答案 0 :(得分:40)
通过限制“其他代码”的访问权限(可能由其他人编写/维护),您可以更自由地在将来更改它,而不必担心会破坏其他依赖它的代码。
问题不在于“我应该将其设为私有吗?”,而是“是否需要将其设为非私人?”。是否有一些其他代码可能需要访问变量?
如果情况确实如此,则指定适当的访问权限(可能通过getter / setter)并接受对其进行更改将很困难。否则你把它保密。
答案 1 :(得分:11)
我认为你应该从另一个方向看待它:你为什么要变量而不是私有?正确的封装意味着隐藏实现的细节,因此默认应该是将字段设为私有。
答案 2 :(得分:8)
基本上,一旦你创建了一个变量public
,你就会被承诺并且永远不会再回到这个决定。每个未来的更改都会改变您的类的公共接口,这反过来意味着需要更改该类的每个用法。对于公共API,这是不可想象的;你的图书馆有效地打破了向后兼容性。
即使对于私人使用的课程,这也是一件大事。
那么您将来何时将变量的范围更改为private
?有许多可以想象的原因。最简单的是,每当变量的值发生变化时,您的类可能需要执行某些操作(例如,记录更改,或相应地更新其他变量)。或者您稍后决定根本不需要变量,并且应该动态计算用户请求的值。
如果您正在直接阅读或设置变量,那是不可能的。相反,您的类需要强制用户调用getter / setter,禁止直接访问变量并提供适当的公共getter / setter方法。
因为一般情况下永远不会预见到此类未来的变化,所以否变量public
已成为公认的最佳做法。 每个变量都应该是private
(或至少是内部的)。
(有一个例外:在某些情况下,final
变量可以安全地生成public
。例如,类似枚举的常量通常在Java库中实现为public final
变量,因为它们永远不会改变,也不需要访问控制,因为它们都是只读的。)
答案 3 :(得分:7)
一般的经验法则是减少变量和方法的范围。保密的内容越多,你就越容易改变你的课程而不会导致系统中其他部分出现问题(即:减少耦合)。
因此,作为一般规则,私人应该是默认
答案 4 :(得分:3)
所以,你必须问自己为什么它必须是私人的。那么,如何通过矛盾思想来运用真理。
可以公开吗? 如果答案是,您不希望人们能够直接访问和修改属性,那么它就不能公开。
可以默认吗? 如果答案是,您不希望相同的包能够直接访问和修改属性,那么它不能是默认的。
可以保护 如果答案是,您不希望子类直接访问和修改属性,则无法保护它。
因此,如果所有答案都是“否”(并且您必须确定在这些情况下不希望访问的原因的答案),那么它必须是私有的。
问题在于,您是否真的了解修饰符给您的内容,以及如何访问它们,而不是盲目地将所有内容设为私有,并创建setter和getter,因为这是您的讲师/书籍/手册所教授的内容你。
答案 5 :(得分:3)
如果通过定义变量private来实现某些功能,那么通过定义java中定义的任何其他访问修饰符,不能实现相同的目的吗?
是。确实如此。任何private
都可以更改为public
(或protected
等等),程序将像以前一样编译和运行。
访问修饰符可以方便程序员使用,并帮助他正确定义类的接口。看看the wikipedia article on encapsulation。
答案 6 :(得分:2)
在以下情况下,该成员是私人的:
此类设计的对象是封装,这意味着您的类实现隐藏在客户端代码中。它提高了代码的可读性,可维护性和可测试性。
答案 7 :(得分:1)
类的要点是封装数据和行为并隐藏内部实现,同时在外部公开干净,简单和有用的API。
需要考虑两个不同的事项:公共合同(API)和私人数据。
私人字段:这是您的私人数据,由于以下原因,您不希望在外部公开:
私有方法:您的实用程序可以使代码更具可读性和可维护性。
公共方法:您向其他人公开的合同(接口,API)。这就是让你的课程变得有用的原因。
公共字段:不要使用它。它只公开部分内部数据。对于简单的类可能没问题,而对于具有相互依赖的字段的复杂类,这是一个很大的禁忌。为了公开功能,您应该使用公共方法(第3点。)。
答案 8 :(得分:0)
其中许多注释适用于内部/嵌套类,方法和构造函数。
基本上,您希望尽可能限制访问,而不会产生过多的复杂性。如果你可以做一些私人或静态的东西,我建议你这样做。如果你可以让场地最终,这通常也有助于提高清晰度。
当某个字段或任何成员是私有的时,您可以立即看到它的使用位置以及何时不再使用它。