Java 理论与实践: 伪typedef反模式-Java基础-Java-编程开发
来源:互联网 发布:淘宝网天猫羽绒服 编辑:程序博客网 时间:2024/05/16 12:32
将泛型添加到 Java语言中增加了类型系统的复杂性,提高了许多变量和方法声明的冗长程度。因为没有提供 “typedef” 工具来定义类型的简短名称,所以有些开发人员转而把扩展当作 “穷人的 typedef”,结果收到了良好的效果。
对于 Java 5.0 中新增的泛型工具,一个常见的抱怨就是,它使代码变得太冗长。原来用一行就够的变量声明不再存在了,与声明参数化类型有关的重复非常讨厌,特别是还没有良好地支持自动补足的 IDE。例如,如果想声明一个 Map,它的键是 Socket,值是 Future
Map socketOwner = new HashMap();
比新方法紧凑得多:
Map
当然,新方法内置了更多类型信息,减少了编程错误,提高了程序的可读性,但是确实带来了更多声明变量和方法签名方面的前期工作。类型参数在声明和初始化中的重复看起来尤其没有必要;Socket 和 Future
合成类似于 typedef 的东西
添加泛型给类型系统增加了一些复杂性。在 Java 5.0 之前,“type” 和 “class” 几乎是同义的,而参数化类型,特别是那些绑定的通配类型,使子类型和子类的概念有了显著区别。类型 ArrayList>、ArrayList extends Number>和 ArrayList
对于原来的简单类型系统,像 C 的 typedef 这样的特性没有意义。但是对于更复杂的类型系统,typedef 工具可能会提供一些好处。不知是好还是坏,总之在泛型加入的时候,typedef 没有加入 Java 语言。
有些人用作 “穷人的 typedef” 的一个(坏的)做法是一个小小的扩展:创建一个类,扩展泛型类型,但是不添加功能,例如 SocketUserMap 类型,如清单 1 所示:
清单 1. 伪 typedef 反模式 —— 不要这么做
public class SocketUserMap extends HashMap
我将这个技巧称为伪 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 的 StringList 和 UserList 类型都扩展了一个公共超类,但是它们不是等价的类型。这意味着任何想调用 lookupAll 的代码都必须传递一个 StringList,而不能是 List
清单 3. 伪类型如何把客户限定在只能使用伪类型
class StringList extends ArrayList
这个限制要比初看上去严格得多。在小程序中,可能不会有太大差异,但是当程序变大的时候,使用伪类型的需求就会不断地造成问题。如果变量类型是 StringList,就不能给它分配普通的 List
同样的情况也适用于方法的参数;如果一个方法参数是 StringList 类型,那么就不能把普通的 List
[1][2]
- Java 理论与实践: 伪typedef反模式-Java基础-Java-编程开发
- Java理论和实践:用软引用阻止内存泄漏-Java基础-Java-编程开发
- Java 理论与实践
- Java 理论与实践:哈希
- Java 理论与实践:哈希
- Java 理论与实践:哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 理论与实践: 哈希
- Java 泛型 理论与实践
- Java 泛型 理论与实践
- Java 理论与实践: 哈希
- Java 5.0 多线程编程实践-Java基础-Java-编程开发
- Java并发编程理论与实践——Thread
- 你知道的Java和你不知道的Java-Java基础-Java-编程开发
- 技巧:Java垃圾收集器使用小诀窍-Java基础-Java-编程开发
- Java Socket编程中的一个秘密类-Java基础-Java-编程开发
- Java规则引擎工作原理及其应用-Java基础-Java-编程开发
- 一针见血谈谈面向对象的思维方法-Java基础-Java-编程开发
- Java 理论与实践: 伪typedef反模式-Java基础-Java-编程开发
- 写Java程序最容易犯的21种错误-Java基础-Java-编程开发
- SUN认证Java2程序员考试(SCJP)试题解析-Java基础-Java-编程开发
- 如何轻松编写一个强大的字符串分解器-Java基础-Java-编程开发
- Java中正则表达式使用方法详解-Java基础-Java-编程开发
- 用Java快速开发Linux GUI应用-Java基础-Java-编程开发
- 该学Java或.NET?-Java基础-Java-编程开发
- 用Java实现几种常见的排序算法-Java基础-Java-编程开发
- .NET 和 Java 之碰撞火花:到底谁快?-Java基础-Java-编程开发