快速业务通道

面向Java开发人员的Scala指南 - 包和访问修饰符 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

面向Java开发人员的Scala指南 - 包和访问修饰符

时间:2011-01-30 Ted Neward

最近,读者的反馈让我意识到在制作本系列的过程中我遗漏了 Scala 的语言的一个重要方面:Scala 的包和访问修饰符功能。所以在研究该语言的函数性元素 apply 机制前,我将先介绍包和访问修饰符。

打包

为了有助于隔离代码,使其不会相互冲突,Java™ 代码提供了 package 关键词,由此创建了一个词法命名空间,用以声明类。本质上,将类 Foo 放置到名为 com.tedneward.util 包中就将正式类名修改成了 com.tedneward.util.Foo;同理,必须按该方法引用类。如果没有,Java 编程人员会很快指出,他们会 import 该包,避免键入正式名的麻烦。的确如此,但这仅意味着根据正式名引用类的工作由编译器和字节码完成。快速浏览一下 javap 的输出,这点就会很明了。

然而,Java 语言中的包还有几个特殊的要求:一定要在包所作用的类所在的 .java 文件的顶端声明包(在将注释应用于包时,这一点会引发很严重的语言问题);该声明的作用域为整个文件。这意味着两个跨包进行紧密耦合的类一定要在跨文件时分离,这会致使两者间的紧密耦合很容易被忽略。

Scala 在打包方面所采取的方法有些不同,它结合使用了 Java 语言的 declaration 方法和 C# 的 scope(限定作用域)方法。了解了这一点,Java 开发人员就可以使用传统的 Java 方法并将 package 声明放在 .scala 文件的顶部,就像普通的 Java 类一样;包声明的作用域为整个文件,就像在 Java 代码中一样。而 Scala 开发人员则可以使用 Scala 的包 “(scoping)限定作用域” 方法,用大括号限制 package 语句的作用域,如清单 1 所示:

清单 1. 简化的打包

package com {  package tedneward  {   package scala   {    package demonstration    {     object App     {      def main(args : Array[String]) : Unit =      {       System.out.println("Howdy, from packaged code!")       args.foreach((i) => System.out.println("Got " + i) )      }     }    }   }  } }

这个代码有效地声明了类 App,或者更确切的说是一个称为 com.tedneward.scala.demonstration.App 的单个类。注意 Scala 还允许用点分隔包名,所以清单 1 中的代码可以更简洁,如清单 2 所示:

清单 2. 简化了的打包(redux)

package com.tedneward.scala.demonstration {   object App   {     def main(args : Array[String]) : Unit =     {      System.out.println("Howdy, from packaged code!")      args.foreach((i) => System.out.println("Got " + i) )     }   } }

用哪一种样式看起来都比较合适,因为它们都编译出一样的代码构造(Scala 将继续编译并和 javac 一样在声明包的子目录中生成 .class 文件)。

面向Java开发人员的Scala指南 - 包和访问修饰符(2)

时间:2011-01-30 Ted Neward

导入

与包相对的当然就是 import 了,Scala 使用它将名称放入当前词法名称空间。本系列的读者已经在此前的很多例子中见到过 import 了,但现在我将指出一些让 Java 开发人员大吃一惊的 import 的特性。

首先,import 可以用于客户机 Scala 文件内的任何地方,并非只可以用在文件的顶部,这样就有了作用域的关联性。因此,在清单 3 中,java.math.BigInteger 导入的作用域被完全限定到了在 App 对象内部定义的方法,其他地方都不行。如果 mathfun 内的其他类或对象要想使用 java.math.BigInteger,就需要像 App 一样导入该类。如果 mathfun 的几个类都想使用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号