知识卡片
外部状态优先用基本类型而非自定义类
内容
[[享元模式的定义、内外部状态与四个角色]]的外部状态若用自定义类作key,须正确覆写 equals/hashCode,否则查找失败;即便覆写正确,性能测试显示自定义类100万次耗172ms, String类型1000万次(多10倍)仅耗78ms——自定义方法开销远高于String内置实现。实践 建议外部状态优先用基本类型。发散:”更面向对象”不等于”更好设计”,抽象层带来性能损耗 而无收益时,朴素实现更合理。
参考来源
- 位置:《设计模式之禅(第2版)》第28章《享元模式》(源文件:_epub-src/text/part0130.html)
- 结论依据:原文对比ExtrinsicState类作为外部状态(100万次172ms)与String作为外部状态(1000万次78ms)的性能差异,并总结"使用自己编写的类作为外部状态,必须覆写equals方法和hashCode方法,而且执行效率还比较低,这种吃力不讨好的事情最好别做,外部状态最好以Java的基本类型作为标志"。
- 原始内容:如果把一个对象作为Map类的键值,一定要确保重写了equals和hashCode方法……执行时间:172 ms……执行时间:78 ms……看到没?一半的效率……使用自己编写的类作为外部状态,必须覆写equals方法和hashCode方法,而且执行效率还比较低,这种吃力不讨好的事情最好别做。