转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> JAVA开发 >> 正文
跨越边界: Java 模型以外的类型策略         ★★★★

跨越边界: Java 模型以外的类型策略

作者:闵涛 文章来源:闵涛的学习笔记 点击数:835 更新时间:2009/4/22 23:33:27
 当谈到 Java 语言的类型方法时,Java 社区分为两大阵营。一些人喜欢编译时错误检查,更好的安全性,以及改善的工具 —— 这些都是静态类型所能提供的特性。而另一些人则偏爱更动态的类型体验。这一次在 跨越边界 中,您将看到两种高生产力的非 Java 语言所使用的一些截然不同的类型策略,并发现在 Java 编程中提高类型灵活性的一些方法。

  在对任何编程语言的讨论中,争议较大的一个问题就是类型模型。类型决定可以使用哪些种类的工具,并影响到应用程序的设计。很多开发人员将类型与生产率或可维护性联系起来(我就是其中的一个)。典型的 Java 开发人员通常都特别乐于维护 Java 语言的类型模型的地位,强调 Java 语言可采用更好的开发工具,在编译时捕捉某些种类的 bug(例如类型不兼容和拼写错误),以及性能等方面的优势。

  如果您想理解一种新的编程语言,甚至一系列语言,那么通常应该从类型策略着手。在本文中,您将看到 Java 之外的一些语言中的类型模型。我首先简要介绍任何语言设计者在类型模型中必须考虑的一些决策,着重介绍静态类型和动态类型的一些不同的决策。我将展示一些不同极端的例子 —— Objective Caml 中的静态类型和 Ruby 中的动态类型。我还将谈到 Java 语言的类型限制,以及如何突破 Java 类型的限制快速编程。

  类型策略

  至少可以从三个角度来看待类型:

  静态类型还是动态类型,这取决于何时 实施类型模型。静态类型语言在编译时实施类型。而动态类型语言通常基于一个对象的特征在运行时实施类型。

  强类型还是弱类型,这取决于如何 实施类型模型。强类型严格地实施类型,如果发现有违反类型规则的情况,则会抛出运行时或编译时错误。而弱类型则留有更多的余地。极端情况下,弱类型语言(例如 Assembler)允许将任意数据类型赋给另一种类型(不管这种赋值是否有意义)。静态类型的语言既可以有强类型,也可以有弱类型;而动态类型系统通常是强类型的,但也不完全是。

  显式类型还是隐式类型,这取决于语言如何确定一个给定对象的类型。显式类型语言要求声明每个变量和每个函数参数。而隐式类型语言则根据语言中的语法和结构线索来确定对象的类型。静态类型语言通常是显式类型的,但也不完全是;而动态类型语言几乎都是隐式类型的。

  下面两个例子很好地阐释了其中两个角度的内涵。假设您编译下面这段 Java 代码:

class Test {
public static void test(int i) {
String s = i;
}
}
  会收到如下错误消息:

Test.java:3: incompatible types
found : int
required: java.lang.String
String s = i;
^
1 error
  执行以下 Ruby 代码:

1 + "hello"
  会收到以下错误消息:

TypeError: String can't be coerced into Fixnum
from (irb):3:in '+'
from (irb):3
  这两种语言都倾向于强类型,因为当您试图使用一个它们期望之外的类型结构的对象时,它们都会抛出错误消息。Java 类型策略在编译时给出错误消息,因为它执行静态类型检查。而 Ruby 则是在运行时给出错误消息,因为 Ruby 支持动态类型。换句话说,Java 在编译时将对象绑定到类型。而 Ruby 则是在运行时每当更改对象的时候将对象绑定到类型。由于我是在 Java 代码中,而不是在 Ruby 中声明变量的,因此可以看到 Java 语言的显式类型与 Ruby 的隐式类型的工作方式不同。

  在这三个角度中,静态类型与动态类型对于语言的特征有最大的影响,因此接下来我将重点解释这两种策略各自的优点。

  静态类型的优点

  在静态类型语言中,程序员(通过声明或根据约定)或编译器(根据结构和语法线索)将一种类型指定给一个变量,然后那个类型就不会改变。静态类型通常需要额外的成本,因为静态类型语言(例如 Java 语言)通常是显式类型的。这意味着必须声明所有的变量,然后编译代码。成本也伴随着收益:早期的错误检测。静态类型在最基层为编译器提供多得多的信息。更多信息所带来的好处就是,可以更早地捕捉到某些类型的错误,而动态类型语言只有到运行时才能检测到这些错误。如果您一直等到运行时才捕捉这些 bug,那么其中一些将进入生产环境。也许这正是动态类型语言受到最多指责的一个方面。

  另一种观点则认为现代软件开发团队通常会运行自动测试,动态语言的支持者声称,即使是最简单的自动测试也可以捕捉到大多数的类型错误。而动态语言的支持者所能提供的对编译时错误检测不利的最好论据是,早期检测所带来的好处相对于成本来说是得不偿失的,因为不管是否使用动态类型,最终都要进行测试。

  一种有趣的折中方法是在静态类型语言中使用隐式类型,从而减少类型的成本。开放源代码语言 Objective Caml (OCaml) 是静态类型语言 Lisp 的衍生物,它既能提供很好的性能,又不会牺牲生产率。OCaml 使用隐式类型,因此可以编写下面这样的采用静态类型的代码:
              
# let x = 4+7

OCaml 返回:

val x : int = 11
  根据表达式中的语法线索,OCaml 推断出 x 的类型。4 是 int 型,7 也是 int 型,因此 x 也必定是 int 型。隐式类型语言可以拥有 Java 语言所具有的所有类型安全性,甚至更多。不同之处在于您需要提供的信息量,以及在阅读程序时可用的信息量。很多喜欢静态类型的人更偏爱隐式类型。他们宁愿让编译器来做这种事情,而不愿意被迫重复地在代码中输入变量的类型。

  隐式类型系统一个较大的优点是,不需要为函数的参数声明类型,因为编译器会从传入的值推断出参数的类型。因此同一个方法可以有多种用途。


[网页制作]JavaScript的三种消息框:警告框、确认框、提示框  [网页制作]JavaScript运算符介绍
[网页制作]JavaScript比较和逻辑运算符介绍  [网页制作]script中的language=javascript和type=text/javas…
[JAVA开发]Java连接各种数据库的实例  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[系统软件]Regular Expression 正则表达式-2 (Java)  [C语言系列]sqlserver在JAVA中的应用
[网页制作]Dreamweaver MX实例:构建Java插入模块  [网页制作]使用Dreamweaver轻松构建Java插入模块
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台