在对课件和实验进行总体复习后,针对其中的重难点以及此前忽视的点进行复习补充和描述
1.不可变的三个方面
1.Immutability:不可变的类型,是指它的值在创建后永远不会改变。
2.Immutable values: 不可变的值,通过final关键字使其可以在初始化时被分配一次,但永远不会被重新分配。
3.Immutable references: 不可变的引用,通过final关键字对变量进行限制,这使得引用
不可转让,但是引用所指向的对象是否可变不受影响。
2.是否可变对重写equals和hashcode方法的影响
对于不可变类型,equals()比较抽象的值。这就等于说equals()应该提供行为上的平等,hashCode()应该将抽象值映射为一个整数,所以设计不可变类型时必须重写这两个方法。
对于可变类型,equals()对引用进行比较,就像‘==’一样。 这与equals()应该提供行为上的平等是一样的。hashCode()应该将引用映射成一个整数。所以设计可变类型时不需要重写 equals() 和 hashCode() ,而应该简单地使用Object提供的默认实现。
关于可变性和等价性:
不可变类型都是行为等价性
可变类型除了Collections是观察等价性,其它都是行为等价性,
3.LSP原则、逆变、协变
基于LSP原则要满足如下限制:
1.前置条件不能强化
2.后置条件不能弱化
3.不变量要保持
4.子类型方法参数符合逆变
5.子类型方法的返回值符合协变
6.异常类型的改动符合协变
逆变:父类到子类的过程中,返回值和异常的类型要不变或变得更抽象
协变:父类到子类的过程中,返回值和异常的类型要不变或变得更具体
4.枚举的使用
当值的集合较小且有限时,可以将所有值设为常量以枚举类结构保存,例如月份,颜色等,可以在后续直接生成类对象调用其中常量。
5.灵活运用继承和委派
上图是实现各类设计模式继承和委派方式,其要点在于遵循CRP原则,尽量避免通过继承机制进行面向复用的设计,尽量通过CRP设计两棵继承树,通过delegation实现“事物”和“行为”的动态绑定,支撑灵活可变的复用。