封装性是面向对象程序设计的原则之一。它规定对象应对外部环境隐藏他们的内部工作方式。良好的封装提高了代码的模块性,它防止了对象之间不良的相互影响,这样就使得未来的开发工作变得容易。
建构具有良好封装性能的对象的第一个步骤就是让getter/setter对访问私有数据域。通过一个你控制的机制来要求那些要对你的对象的域进行读和写的其他对象这样去做,可以使你加强法定值和内部数据的连贯性。如果你有一个域名为duration,它应该保存一个正整数,当另一个对象试图进行setDuration(-4)时,你就可以给出一个IllegalArgumentException。如果你将你的duration成员设置为公有,你就不能防止某人调用yourObject.duration=-4并搞乱你的数据的内部连贯性。
你的对象通过方式返回值实现的数据不应是可修改的,它不能改变对象的内部状态。返回原始值使你不用为这件事担心。当你返回一个Char,其他人可以对他们收到的Char进行变更而不会修改这个Char,因为Java使用值的传递来返回原始值。
然而,在返回对象时,你必须认真地监视他们的变动性。当一个对象的值在例示之后不能被变更,这就是说它是不可变的。在java.lang数据包等级中的很多对象都是不可变的,包括String, Char和Short。
1.数据成员必须是私有的,防止被外部的代码直接地操纵。
2.不能提供setter方式,目的就是不允许对被封装的数据的变更。
3.类本身必须是最终的,声明类为最终的可以防止另一个类创建不可变类的可变子类。
返回可变对象使得在对象外部的代码可以修改对象内部的数据而不会出现警告或是可能的干涉。例如,你有一个代表一份办公信件的Letter对象,它包括一个含有地址名称的Recipient对象,如果这个Recipient对象是可变的,任何从前调用过getRecipient方式的对象都可以修改信中的Recipient,而不需要setRecipient方式,仅仅是通过更改返回的Recipient对象中存储的数据。