创建独一无二的包名

你也许会发现,既然一个包从未真正将被打包的东西包装成一个单一的文件,并且一个包可
以由许多文件构成,那么情况就有点复杂了。为了避免这种情况的发生,一种合乎逻辑的作
法就是将特定包的所有.class 文件都置于一个单一目录之下。也就是说,利用操作系统的
层次化的文件结构来解决这一问题。这是 java 解决混乱问题的一种方式,你还会在我们介
绍 jar 工具的时候看到另一种方式。


将所有的文件收入一个子目录还可以解决了另外两个问题:怎样创建独一无二的名称以及怎
样查找有可能隐藏于目录结构中某处的类。正如我们在第二章中所介绍的那样,这些任务是
通过将.class 文件所在的路径位置编码成 package 名称来实现的。按照惯例,package
名称的第一部分是反顺序的类的创建者的 Internet 域名。如果你遵照惯例,Internet 域名
应是独一无二的,因此你的 package 名称也将是独一无二的,也就不会出现名称冲突的
问题了。(也就是说,只有在你将自己的域名给了别人,而他又以你曾经使用过的路径名称
来编写 java 程序代码时,才会出现冲突。)当然,如果你没有自己的域名,你就得构造一
组不大可能与他人重复的组合,例如你的姓名,来创立一些独一无二的 package 名称。
如果你打算发布你的 java 程序代码,稍微花点力气去取得一个域名,还是很有必要的。
此技巧的第二部分是把 package 名称分解为你机器上的一个目录。所以当 java 程序运行

并且需要加载.class 文件的时候(当需要为特定的类生成对象或首次访问类的 static 成员
时,程序会自动进行加载),它就可以确定.class 文件在目录上所处的位置。
Java解释器(interpreter)的运行过程如下:首先,找出环境变量CLASSPATH2(可以
通过操作系统,有时也可通过在你的机器上安装用Java  或 Java-based 工具的安装程序
来设置。)CLASSPATH包含一个或多个目录,用来作为查找.class文件的根目录。从根
目录开始,解释器获取包的名称并将每个句点替换成反斜杠以从CLASSPATH 根中产生一
个 路 径 名 称 ( 于 是 , package foo.bar.baz 就 变 成 为 foo\bar\baz 或
foo/bar/baz 或其他什么可能的东西,这一切取决于你的操作系统)。得到的路径会与
CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类相关
的名称的.class文件。(解释器还会去查找某些相对于它所在位置的标准目录)。
为 了 理 解 这 一 点 , 以 我 的 域 名 bruceeckel.com 为 例 。 把 它 的 顺 序 倒 过 来 ,
bruceeckel.com 就成了我所创建的类的一个别具一格的名称。(com, edu, org 等扩展
名先前在 java 包中都是大写的,但在 java2 中一切都已改观,包的整个名称全都变成了小
写。)若我决定再创建一个名为 simple 的程序库,我可以将该名称进一步细分,于是我
可以得到一个包的名称:


package com.bruceeckel.simple;


现在,这个包名称就可以用作下面两个文件的名字空间保护伞了:


//: com:bruceeckel:simple:Vector.java
// Creating a package.
package com.bruceeckel.simple;


public class Vector {
public Vector() {
    System.out.println("com.bruceeckel.simple.Vector");
    } 
} ///:~


你在创建自己的包时,将会发现 package 语句必须是文件中的第一行非注释程序代码。
第二个文件看起来也极其相似:


//: com:bruceeckel:simple:List.java
// Creating a package.
package com.bruceeckel.simple;


public class List {
public List() {
    System.out.println("com.bruceeckel.simple.List"); 
    } 
} ///:~


这两个文件均被置于我的系统的子目录下:


C:\DOC\JavaT\com\bruceeckel\simple


如果你沿此路径向回看,你可以看到包的名称 com.bruceeckel.simple,但此路径的
第一部分怎样办呢?它将由环境变量 CLASSPATH 关照,在我的机器上是:


CLASSPATH=.;D:\JAVA\LIB;C:\DOC\JavaT


你可以看到,CLASSPATH 可以包含多个可选择的查询路径。


但在使用 JAR 文件时会有一点变化。你得在 classpath 中将 JAR 文件的名称写清楚,而不
仅是指明它所在位置的目录。因此,对于一个名为 grape.jar 的 JAR 文件,你的 classpath
应包括:


CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar


一旦 classpath 得以正确建立,下面的文件就可以放于任何目录之下:


//: c05:LibTest.java
// Uses the library.
import com.bruceeckel.simpletest.*;
import com.bruceeckel.simple.*;


public class LibTest {
static Test monitor = new Test();
public static void main(String[] args) {
    Vector v = new Vector();
        List l = new List();
        monitor.expect(new String[] {
"com.bruceeckel.simple.Vector",
"com.bruceeckel.simple.List"
        }); 
    } 
} ///:~


当编译器碰到要导入 simple 类库的 import 语句时,就开始在 CLASSPATH 所指定的目
录中查找,以查找子目录 com\bruceeckel\simple,然后从已编辑的文件中找出名称相符
者(对 Vector 而言是 Vector.class,对 List 而言是 List.class)。请注意,Vector
和 List 中的类以及要使用的方法都必须是 public 的。


对于使用java的新手而言,设立CLASSPATH是如此麻烦的一件事(在我最初使用时是这
样的)。为此Sun将java2 中的JDK被改造得更聪明了一些。在安装后,你会发现,即使你
未设立CLASSPATH,你也可以编辑并运行基本的java程序。然而,要编辑和运行本书的
 
源码包,你就得向你的CLASSPATH中添加本

书程序代码树中的基目录了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值