实现模式之状态
??????对象方便地包装了行为(behavior)与状态(state):前者被暴露给外部世界,后者则为前者提供支持。对象的好处之一就是将程序中的所有状态分割成小块,每一块都有属于自己的计算环境。这样每一块状态的改变都在可控范围内,编写程序其实就是在改变每一个对象的状态,通过对象状态的转变达到我们要实现的目的。如何访问与修改状态是必须要面对的问题。
????
???? 1. 直接访问
?????比如: x = 10? 这种访问方式好处是表达清晰,一眼就能看出x到了什么状态。但这是以损失灵活性为代价的,如果在多个地方需要对同一变量赋值,那么当赋的值需要修改就得同时修改多个地方。另外还有一个缺点:这种操作属于实现细节,其层面低于编程时通常的思考层面。比如说:上面我把x=10的目的是要打开车库的大门,我们应该这样做:openDoor(); 利用一个方法来表达我们的意图。编程时通常的思考层面与存储无关,如果程序中到处都是直接访问变量,就会给沟通带来障碍。(编程的时候,应该尽量为阅读者扫清障碍,先告诉阅读者一个大概的轮廓,如果想具体了解细节,他可以到更细的类或者方法中去查看。)
?
???? 2. 间接访问
???? 间接访问就是用方法调来对状态进行访问与修改,这种访问方式带来更好的灵活性。用访问器封装状态之后,使用者就无法获知某一个值是否直接被存储,因此你也可以改变存储方式,而不会对使用者代码造成什么影响。
???? 什么时候直接访问,什么时候该间接访问呢?默认的策略是:允许在类(及其内部类)中直接访问,其他的使用者必须间接访问。
?
????? 3. 及早初始化
????? 一旦变量出现(变量声明或者变量所指的对象创建的时候)就立即初始化。及早初始化的好处在于,可以保证变量在使用之前一定是被初始化过的。比如在声明的时候初始化和在构造函数中初始化。
???? 为了美观,最好在同一地方初始化所有的字段。
????
???? 4. 延迟初始化
???? 假如在初始化的一个值的时候成本很高,初始化之后又不一定会用,那么可以延迟到使用它的时候再进行初始化。比如创建一个getter方法,如果对象为空,则初始化。
?
?
?
?
?