2.2 使用包组织类

所有JVM语言都定义了其创建类和实例化对象的语法,但它们生成的类文件最终都将在JVM上运行。为了能够在JVM上运行以及与使用其他JVM语言编写的类互操作,必须遵循JVM在类组织方面的要求。本节将讨论如下主题:

  • 包;
  • 选择包名;
  • 包名举例;
  • 全限定类名。

2.2 使用包组织类 - 图1 要明白Java类库的组织方式以及如何从命令行运行JVM应用程序,必须对包有所了解。这两个主题都将在本章讨论。

2.2.1 包是什么

本书介绍的语言大都支持将类组织成包。位于同一个包中的类构成了一个独特的命名空间,这是JVM最重要的特征。有些语言本身不支持将类组织成包,但支持引用包中的类。

2.2 使用包组织类 - 图2 一个这样的例子是Oracle的JavaScript解释器Nashorn。JavaScript语言本身不支持包,但Nashorn能够导入放在包中的Java(或其他兼容)类。

为演示如何将类组织成包,下面再来看看电子商务应用程序中购物车的实现,但这里的示例将更成熟些。

2.2 使用包组织类 - 图3

JVM提供了一种对类进行组织的方式——将它们放在包中。通过这样做,可将主题相同的类编组。就刚才的示例而言,将涉及的类放在下面这些包中比较合理。

包中的类
basket Basket、BasketLine
product Product
user User

之所以选择这种组织方式,是因为我认为这些类的主题分别为购物车、商品和用户。另外,我预计未来Basket、Product和User类将被其他类使用,而BasketLine类只会在Basket类内部使用。

通过使用包,不仅可让大型项目的结构更容易理解(这一点你将在稍后看到),还可通过使用访问修饰符对其他包中的类隐藏类成员。

要高效地使用包,必须了解几乎所有JVM项目都遵循的约定。虽然上表选择的包名完全合法,但给包命名时应遵循一定的约定。

2.2.2 选择包名

包名必须遵守如下几个规则。

  • 包名可包含句点;实际上,句点用于分隔名称中的不同元素。
  • 包名中的元素可包含字母、数字和下划线。
  • 包名中的每个元素都必须以字母打头,而不能以数字打头(数字只能跟在字母后面)。
  • 包名中的元素不能是Java保留的关键字,这包括基本类型的名称(如intshort)以及内置关键字(如classforfinal)。

有一些大多数重要项目都遵守的通用命名约定。在所有项目中,都强烈建议你在给包命名时遵守如下约定。

  • 整个包名都为小写。
  • 包名以如下URL打头。
    • 公司网站的URL。
    • 项目网站的URL。
    • 项目公开源代码仓库的URL。
    • 个人主页或博客的URL。
  • 你可制定自己的约定,以便将不同的类区分开来,避免不同的项目发生命名冲突。为此,可在包名中添加部门名称、办事处名称或项目名。
  • 如果包名包含非法元素,可在前面或后面添加下划线使其合法,或将非法字符替换为下划线。

2.2.3 包名举例

假设你受雇于JVM University,要为它开发一个在线Web编程类,而这个类可通过http://www.example.com/jvm-university来访问。

在这种情况下,合法的包名如下:

  • com.example.jvm_university.class_.web_programming
  • com.example.jvm_university.webprogramming
  • com.example.jvm.university.web_programming

2.2.4 全限定类名

在有些情况下,必须使用全限定包名,即以完整的包名打头的类名。来看一个示例:

  1. package com.example.jvm.university.web_programming;
  2. class Application {
  3. }

对于这个类,全限定类名为com.example.jvm.university.web_programming.Application