刚开始学c++、java时候一直非常纳闷为什么要把类的属性设为private,修改这些属性通过getset方法,当时的解释是安全。core Java对此的解释是三个好处:
1.安全
比如People类的属性name可以设置为只读域,即只有get方法,没有set方法,当在构造方法中设置完毕,就没有任何一个办法可以对它进行修改,这样来确保name域不会受到外界的破坏。
2.方便调试
People类的属性age虽然不是只读域,但是只能通过setAge (int age)
方法进行修改,一旦这个属性值出现了问题,只要调试这个方法就可以了。如果age属性是public
修饰,破坏这个属性值的捣乱者则可能出现在任何地方。
3.可以轻易改变内部实现
如果将存储名字的属性改为
String firstName;
String lastName;
那么getName方法可以改为返回
firstName+" "+lastName
,只需要修改getName()
方法的内部实现,不会影响到其他代码。
4.可以执行错误检查
比如setAge()
方法我们可以在设置之前判断参数age是否大于0。
在《码出高效》中对于封装的好处是这么描述的:封装是由俭入奢易,由奢入俭难。属性值的访问与修改需要使用相应的getter/setter
方法,而不是对public
的属性进行读取和修改。
如果有一天,类的提供方想在修改属性的setter
方法上进行鉴权控制,日志记录,这是在直接访问属性的情形中无法做到的。若是将已经公开的属性和行为直接暴力修改为private
,则依赖模块都会编译出错。所以,在不知道什么样的访问控制权限合适的时候,优先推荐使用private
控制级别
网友评论