首先不仅仅将变量设为公共的主要原因是,如果您确实将其设为公共,那么以后您会更加头疼。
例如,一个程序员围绕私有成员变量编写公共获取器和设置器。三个月后,他需要验证该变量永远不会“设置”为空。他在“
setFoo(…)”方法中添加了一个检查,然后将检查所有尝试设置变量的“将其设置为null”。案件结案,并毫不费力。
另一位程序员意识到,将公共获取器和设置器放在私有成员变量周围违反了封装的精神,他看到了这些方法的徒劳性,并决定将成员变量公开。也许这可以提高性能,或者程序员只想“在使用时编写它”。三个月后,他需要验证该变量永远不会“设置”为空。他扫描对变量的每次访问,有效地搜索整个代码库,包括可能通过反射访问变量的所有代码。这包括所有扩展了他的代码的第三方库,以及所有新的在编写代码后使用他的代码的模块。然后,他要么修改所有调用,以确保变量永远不会设置为null。案件永远不会结案,因为他无法有效地找到对暴露成员的所有访问权限,也无法访问所有第三方的源代码。由于对新编写的模块的知识不完善,因此可以保证调查不完整。最后,他无法控制将来可能访问公共成员的代码,并且该代码可能包含将member变量设置为null的行。
当然,第二个程序员然后可以通过在变量周围放置“ get”和“
set”方法并将其设置为私有来破坏所有现有代码,但是,嘿,他可以在三个月前完成该工作,并省去了为什么需要这样做的解释。破坏其他人的代码。
随便怎么说,但是将公共“获取”和“设置”方法放在私有成员变量周围是防御性编程,它是由多年(即数十年)的经验带来的。



