读Java实战(第二版)笔记12_重构、测试和调试,
分享于 点击 40707 次 点评:212
读Java实战(第二版)笔记12_重构、测试和调试,
1. 设计模式
1.1. 对设计经验的归纳总结
1.2. 一种可重用的蓝图
1.3. Java 5引入了for-each循环
1.3.1. 替代了很多显式使用迭代器的情形
1.4. Java 7推出的菱形操作符(<>)
1.4.1. 帮助大家在创建实例时无须显式使用泛型
1.4.2. 推动了Java程序员们采用类型接口(type interface)进行程序设计
1.5. 单例模式
1.5.1. 一般用于限制类的实例化,仅生成一份对象
1.6. 访问者模式
1.6.1. 常用于分离程序的算法和它的操作对象
2. 策略模式
2.1. 解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案
2.2. 一个代表某个算法的接口(Strategy接口)
2.3. 一个或多个该接口的具体实现,它们代表了算法的多种实现
2.4. 一个或多个使用策略对象的客户
2.5. Lambda表达式避免了采用策略设计模式时僵化的模板代码
3. 模板方法模式
3.1. 如果需要采用某个算法的框架,同时又希望有一定的灵活度,能对它的某些部分进行改进
3.2. “希望使用这个算法,但是需要对其中的某些行进行改进,才能达到希望的效果”时是非常有用的
3.3. 通过传递Lambda表达式,直接插入不同的行为,不再需要继承
3.4. Lamba表达式能帮助解决设计模式与生俱来的设计僵化问题
4. 观察者模式
4.1. 消除僵化代码
4.1.1. 直接传递Lambda表达式表示需要执行的行为即可
4.2. 某些事件发生时(比如状态转变),如果一个对象(通常称之为主题)需要自动地通知其他多个对象(称为观察者)
5. 责任链模式
5.1. 通过定义一个代表处理对象的抽象类来实现的,在抽象类中会定义一个字段来记录后续对象
5.2. UnaryOperator的一个实例
5.2.1. 为了链接这些函数,需要使用andThen方法对其进行构造
6. 工厂模式
6.1. 无须向客户暴露实例化的逻辑就能完成对象的创建
6.2. 特殊的函数接口TriFunction
public interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();
7. 改善程序代码的可读性
7.1. 代码的可读性
7.1.1. 别人理解这段代码的难易程度
7.1.2. 确保你的代码能非常容易地被包括自己在内的所有人理解和维护
7.2. 重构代码,用Lambda表达式取代匿名类
7.3. 用方法引用重构Lambda表达式
7.4. 用Stream API重构命令式的数据处理
8. 从匿名类到Lambda表达式的转换
8.1. “更简洁”来描述Lambda表达式是因为相较于匿名类
8.2. 匿名类和Lambda表达式中的this和super的含义是不同的
8.2.1. 在匿名类中,this代表的是类自身
8.2.2. 在Lambda中,它代表的是包含类
8.3. 匿名类可以屏蔽包含类的变量
8.4. Lambda表达式不能(会导致编译错误)
2.1. 解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案
2.2. 一个代表某个算法的接口(Strategy接口)
2.3. 一个或多个该接口的具体实现,它们代表了算法的多种实现
2.4. 一个或多个使用策略对象的客户
2.5. Lambda表达式避免了采用策略设计模式时僵化的模板代码
3. 模板方法模式
3.1. 如果需要采用某个算法的框架,同时又希望有一定的灵活度,能对它的某些部分进行改进
3.2. “希望使用这个算法,但是需要对其中的某些行进行改进,才能达到希望的效果”时是非常有用的
3.3. 通过传递Lambda表达式,直接插入不同的行为,不再需要继承
3.4. Lamba表达式能帮助解决设计模式与生俱来的设计僵化问题
4. 观察者模式
4.1. 消除僵化代码
4.1.1. 直接传递Lambda表达式表示需要执行的行为即可
4.2. 某些事件发生时(比如状态转变),如果一个对象(通常称之为主题)需要自动地通知其他多个对象(称为观察者)
5. 责任链模式
5.1. 通过定义一个代表处理对象的抽象类来实现的,在抽象类中会定义一个字段来记录后续对象
5.2. UnaryOperator的一个实例
5.2.1. 为了链接这些函数,需要使用andThen方法对其进行构造
6. 工厂模式
6.1. 无须向客户暴露实例化的逻辑就能完成对象的创建
6.2. 特殊的函数接口TriFunction
public interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();
7. 改善程序代码的可读性
7.1. 代码的可读性
7.1.1. 别人理解这段代码的难易程度
7.1.2. 确保你的代码能非常容易地被包括自己在内的所有人理解和维护
7.2. 重构代码,用Lambda表达式取代匿名类
7.3. 用方法引用重构Lambda表达式
7.4. 用Stream API重构命令式的数据处理
8. 从匿名类到Lambda表达式的转换
8.1. “更简洁”来描述Lambda表达式是因为相较于匿名类
8.2. 匿名类和Lambda表达式中的this和super的含义是不同的
8.2.1. 在匿名类中,this代表的是类自身
8.2.2. 在Lambda中,它代表的是包含类
8.3. 匿名类可以屏蔽包含类的变量
8.4. Lambda表达式不能(会导致编译错误)
4.1. 消除僵化代码
4.1.1. 直接传递Lambda表达式表示需要执行的行为即可
4.2. 某些事件发生时(比如状态转变),如果一个对象(通常称之为主题)需要自动地通知其他多个对象(称为观察者)
5. 责任链模式
5.1. 通过定义一个代表处理对象的抽象类来实现的,在抽象类中会定义一个字段来记录后续对象
5.2. UnaryOperator的一个实例
5.2.1. 为了链接这些函数,需要使用andThen方法对其进行构造
6. 工厂模式
6.1. 无须向客户暴露实例化的逻辑就能完成对象的创建
6.2. 特殊的函数接口TriFunction
public interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();
7. 改善程序代码的可读性
7.1. 代码的可读性
7.1.1. 别人理解这段代码的难易程度
7.1.2. 确保你的代码能非常容易地被包括自己在内的所有人理解和维护
7.2. 重构代码,用Lambda表达式取代匿名类
7.3. 用方法引用重构Lambda表达式
7.4. 用Stream API重构命令式的数据处理
8. 从匿名类到Lambda表达式的转换
8.1. “更简洁”来描述Lambda表达式是因为相较于匿名类
8.2. 匿名类和Lambda表达式中的this和super的含义是不同的
8.2.1. 在匿名类中,this代表的是类自身
8.2.2. 在Lambda中,它代表的是包含类
8.3. 匿名类可以屏蔽包含类的变量
8.4. Lambda表达式不能(会导致编译错误)
6.1. 无须向客户暴露实例化的逻辑就能完成对象的创建
6.2. 特殊的函数接口TriFunction
public interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();
用户点评