- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java理论与实践伪typedef反模式.doc
Java 理论与实践: 伪 typedef 反模式
扩展不是类型定义
将泛型添加到 Java? 语言中增加了类型系统的复杂性,提高了许多变量和方法声明的冗长程度。因为没有提供 “typedef” 工具来定义类型的简短名称,所以有些开发人员转而把扩展当作 “穷人的 typedef”,结果收到了良好的效果。在这个月的 Java 理论与实践 中,Java 专家 Brian Goetz 解释了这个 “反模式” 的限制。
对于 Java 5.0 中新增的泛型工具,一个常见的抱怨就是,它使代码变得太冗长。原来用一行就够的变量声明不再存在了,与声明参数化类型有关的重复非常讨厌,特别是还没有良好地支持自动补足的 IDE。例如,如果想声明一个 Map,它的键是 Socket,值是 FutureString,那么老方法就是:
Map socketOwner = new HashMap();比新方法紧凑得多:
MapSocket, FutureString socketOwner
= new HashMapSocket, FutureString();
当然,新方法内置了更多类型信息,减少了编程错误,提高了程序的可读性,但是确实带来了更多声明变量和方法签名方面的前期工作。类型参数在声明和初始化中的重复看起来尤其没有必要;Socket 和 FutureString 需要输入两次,这迫使我们违犯了 “DRY” 原则(不要重复自己)。
合成类似于 typedef 的东西
添加泛型给类型系统增加了一些复杂性。在 Java 5.0 之前,“type” 和 “class” 几乎是同义的,而参数化类型,特别是那些绑定的通配类型,使子类型和子类的概念有了显著区别。类型 ArrayList?、ArrayList? extends Number 和 ArrayListInteger 是不同的类型,虽然它们是由同一个类 ArrayList 实现的。这些类型构成了一个层次结构;ArrayList? 是 ArrayList? extends Number 的超类型,而 ArrayList? extends Number 是 ArrayListInteger 的超类型。
对于原来的简单类型系统,像 C 的 typedef 这样的特性没有意义。但是对于更复杂的类型系统,typedef 工具可能会提供一些好处。不知是好还是坏,总之在泛型加入的时候,typedef 没有加入 Java 语言。
有些人用作 “穷人的 typedef” 的一个(坏的)做法是一个小小的扩展:创建一个类,扩展泛型类型,但是不添加功能,例如 SocketUserMap 类型,如清单 1 所示:
清单 1. 伪 typedef 反模式 —— 不要这么做
public class SocketUserMap extends HashMapSocketFutureString { }
SocketUserMap socketOwner = new SocketUserMap();
我将这个技巧称为伪 typedef 反模式,它实现了将 socketOwner 定义简化为一行的这一(有问题的)目标,但是有些副作用,最终成为重用和维护的障碍。(对于有明确的构造函数而不是无参构造函数的类来说,派生类也需要声明每个构造函数,因为构造函数没有被继承。)
伪类型的问题
在 C 中,用 typedef 定义一个新类型更像是宏,而不是类型声明。定义等价类型的 typedef,可以与原始类型自由地互换。清单 2 显示了一个定义回调函数的示例,其中在签名中使用了一个 typedef,但是调用者提供给回调的是一个等价类型,而编译器和运行时都可以接受它:
清单 2. C 语言的 typedef 示例
// Define a type called callback that is a function pointer
typedef void (*Callback)(int);
void doSomething(Callback callback) { }
// This function conforms to the type defined by Callback
void callbackFunction(int arg) { }
// So a caller can pass the address of callbackFunction to doSomething
void useCallback() {
doSomething(callbackFunction);
}
扩展不是类型定义
用 Java 语言编写的试图使用伪 typedef 的等价程序就会出现麻烦。清单 3
您可能关注的文档
- CMTS测试方法操作说明及结果-江苏有线.doc
- C程序-多库文档.ppt
- C程序设计(第三版).ppt
- C语言的语句.ppt
- C语言程序设计_数组_4.ppt.ppt
- C语言程序设计广东科技学院.ppt
- C语言试卷4.doc-淮海工学院.doc
- data译者署名呆呆大虾译者链接版本Android3.2语法data.doc
- DreamweaverMX2004入门篇讲义.ppt
- EcStore模板文档-ShopEx模板开发手册.doc
- 2022-2023学年度初三语文月考真题模拟练习题.doc
- 2022-2023学年度初一语文期末能力练习题.doc
- 2022-2023学年度初一语文期末基础知识复习卷.doc
- 2022-2023学年度初二语文期中试题真题模拟冲刺卷_0.doc
- 2022-2023学年度初二语文期中试题基础知识试题.doc
- 2022-2023学年度初三数学期末基础知识模拟考试题_0.doc
- 2022-2023学年度初三语文期末试题真题模拟.doc
- 2022-2023学年度初三语文质量调查真题模拟题.doc
- 2022-2023学年度八年级(下)数学期末提升测(2)真题模拟习卷.doc
- 2022-2023学年度初三数学综合练习真题模拟复习题.doc
文档评论(0)