快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
nt) = { a / b }       def bizdivide(a : Int, b : Int) = { a * b }         private[mathfun] def bizexp(a : Int, b: Int) = 0      }     }    }   } }

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

时间:2011-01-30 Ted Neward

注意此处的 private[mathfun] 表达。本质上,这里的访问修饰符是说该成员直到 包 mathfun 为止都是私有的;这意味着包 mathfun 的任何成员都有权访问 bizexp,但任何包以外的成员都无权访问它,包括子类。

这一点的强大意义就在于任何包都可以使用 “private” 或者 “protected” 声明甚至 com(乃至 _root_,它是根名称空间的别名,因此本质上 private[_root_] 等效于 “public” 同)进行声明。这使得 Scala 能够为访问规范提供一定程度的灵活性,远远高于 Java 语言所提供的灵活性。

实际上,Scala 提供了一个更高程度的访问规范:对象私有 规范,用 private[this] 表示,它规定只有被同一对象调用的成员可以访问有关成员,其他对象里的成员都不可以,即使对象的类型相同(这弥合了 Java 访问规范系统中的一个缺口,这个缺口除对 Java 编程问题有用外,别无他用。)

注意访问修饰符必须在某种程度上在 JVM 之上映射,这致使定义中的细枝末节会在从正规 Java 代码中调用或编译时丢失。例如,上面的 BizarroMath 示例(用 private[mathfun] 声明的成员 bizexp)将会生成清单 9 中的类定义(当用 javap 来查看时):

Listing 9. Enron 的记帐库,JVM 视图

Compiled from "packaging.scala" public final class com.tedneward.scala.mathfun.BizarroMath   extends java.lang.Object {    public static final int $tag();    public static final int bizexp(int, int);    public static final int bizdivide(int, int);    public static final int bizmultiply(int, int);    public static final int bizminus(int, int);    public static final int bizplus(int, int); }

在编译的 BizarroMath 类的第二行很容易看出,bizexp() 方法被赋予了 JVM 级别的 public 访问修饰符,这意味着一旦 Scala 编译器结束访问检查,细微的 private[mathfun] 区别就会丢失。因此,对于那些要从 Java 代码使用的 Scala 代码,我宁愿坚持传统的 “private” 和 “public” 的定义(甚至 “protected” 的定义有时最终映射到 JVM 级别的 “public”,所有不确定的时候,请对照实际编译的字节码参考一下 javap,以确认其访问级别。)

应用

在本系列上一期的文章中(“集合类型”),当谈及 Scala 中的数组时(确切地说是 Array[T])我说过:“获取数组的第 i 个元素” 实际上是 “那些名称很有趣的方法中的一种……”。尽管当时是因为我不想深入细节,但不管怎么说事实证明这种说法严格来说 是不对的。

好吧,我承认,我说谎了。

技术上讲,在 Array[T] 类上使用圆括号要比使用 “名称有趣的方法” 复杂一点;Scala 为特殊的字符序列(即那些有左右括号的序列)保留了一个特殊名称关联,因为它有着特殊的使用意图 :“做”……(或按函数来说,将……“应用” 到……)。

换句话说,Scala 有一个特殊的语法(更确切一些,是一个特殊的语法关系)来代替 “应用” 操作符 “()”。更精确地说,当用 () 作为方法调用来调用所述对象时,Scala 将称为 apply() 的方法作为调用的方法。例如,一个想充当仿函数(functor)的类(一个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号