详解Java编程中包package的内容与包对象的规范

包的内容
包的内容应该仔细设计,使其只包含在功能上相关的类和接口。包中的类可以自由地访问该包中其他类的非私有成员,有些类甚至可能有足够的权限去访问其他类的内部细节,为了避免这样的类对类成员进行误操作,我们需要对类成员进行保护。任何没有被声明为private的成员都可以被同一个包中的其他所有类型访问,所以任何不相关的类之间的藕合程度都可能会比我们所期望的程度高。

  包还为寻找有用的接口和类的程序员提供了逻辑分组的功能。由不相关的类组成的包使程序员很难分辨出哪些接口和类是有用的,而类的逻辑分组可以帮助程序员重用代码,因为程序员通过逻辑分组能够更容易地找到他们所需要的东西。如果包中只包含相关的、紧藕合的类型集,则意味着我们可以给类型取一些更直观的名字,从而避免名字冲突。

  包可以嵌套。例如,java.lang就是一个嵌套包,其中,包Lang嵌套在更大的包java中,而包j ava却还包含一些其他的包。嵌套使得相关的包构成了具有层次结构的命名系统。

  例如,为了创建一组包,用于诸如神经网络和遗传算法这样的自适应系统,我们可以用以圆点分隔的名字来命名包,从而创建嵌套包:

  package adaptive. neural Net;

  含有上面这条声明语句的源文件位于adaptive.neuralNet包中,而adaptive.neuralNet包本身又是adaptive包的子包。adaptive包中可能包含一些与通用的自适应算法相关的类,例如泛化问题陈述类或基准测试类。在层次结构中处于更深位置的包(例如adaptive. neu-ralNet或adaptive.genetic)包含与特定类型的自适应算法相关的类。

  包的嵌套仅仅是组织相关包的一种工具,它并不能提供包之间的任何特殊的访问权限。

  adaptive.genetic包中的类代码无法访问adaptive或adaptive.neuralNet包中具有包访问权限的成员,包作用域只适用于特定的包。包的嵌套可以对相关的包进行分组,并帮助程序员更方便地在逻辑层次中找到想要的类,但是除此之外,它并未带来其他的任何益处。

  包的注解

  包也可以有注解。但是问题在于,由于包是一种组织结构,没有源代码实体,它们并没有实际的定义,所以不能像对类或方法那样对它们进行注解,因此包的注解只能通过在源文件中对包的声明语句进行注解来实现。然而,在每个包中只能有一个包声明可以拥有作用于它的注解。

  那么究竟如何对包进行注解呢?事实上,Java语言并没有强制程序员必须使用某种方式来处理“单一注解的包语句”规则。所建议的方式是在包目录中创建一个名为package一i nfo.java的文件,在这个文件中只存储包语句和该包的注解,而不放置任何其他内容。例如,用于attr包的package一info.java文件看起来就是这样的:

  @PackageSpec(name二”Attr Project",version="1.0"

  @DevelopmentSite("attr.project.org")

  @DevelopmentModel("open一source")

  package attr;

  其中Packagespec,Developmentsite和Devel opmentmodel用来修饰注解类型,当然,它们具有运行时的保存策略。package一info.java文件应该和包中的其他源文件一起编译。

  我们推荐将所有与包相关的信息都放置在package一info. java文件中。如果你这样做了,那么你就可以在文件的开头放置文档注释,从而使这些文档被注释成包文档。

包对象和规范
包通常会实现某种规范,并且通常是来自于某个组织的。Package对象与其他的反射类型不同,不能用来创建或操作包,而只能充当提供信息的知识库,用来提供有关包所实现的规范的信息(规范的标题、供应商和版本号)和有关包的实现本身的信息(包的标题、供应商和版本号)。虽然包通常来自于单个的组织,但它所实现的规范(如统计分析库)却可能是其他组织已定义过的。使用包的程序可能需要知道该包所实现的规范的版本,从而可以使用只在某个版本中定义的功能。类似地,这些程序还可能需要知道提供给它的是哪个实现版本,这主要是为了处理在不同版本中可能存在的缺陷。Package类的一些主要方法允许访问到这些信息:

  •   ·public Stri ng getName ():返回该包的名字。
  •   .public string getspecificationTitle p:返回该包所实现的规范的标题,如果标题未知,则返回null,
  •   .public string getspecificationversion():返回一个描述该包所实现的规范的版本信息的字符串,如果版本信息未知,则返回null,
  •   .public string getspecificationvendor Q:返回供应商的名字,这个供应商拥有并维护该包所实现的规范,如果供应商未知,则返回null,
  •   .public string getImplerentationTitle():返回该包所提供的实现的标题,如果标题未知,则返回null, ·public string getImplementationversion():返回一个描述该包所提供的实现的版本信息的字符串,如果版本信息未知,则返回null,
  •   ·public string getImplementationvendor():返回提供该实现的组织(供应商)的名字,如果该组织未知,则返回null,

  例如,在我们的系统中提取java.lang包的这些信息,将会得到如下结果:'

  Specification Title: Java Platform API Specification

  Specification Version: 1.4

  Specification Vendor:Sun Microsystems,Inc.

  Implementation Title:Java Runtime Environment

  Implementation Version:1.5.0_02

  Implementation Vendor: Sun Microsystems,Inc.

  规范版本号由句点分隔符分开的非负数字组成,如‘'2.0'‘或”11.0.12"。这种模式使得我们可以调用iscompatiblewith方法对遵循该模式的版本号与包的版本号进行比较。如果包的版本号大于等于传人的版本号,那么该方法就返回true。这种比较每次只比较一个由句点分隔的数字,如果这些数字中任何一个小于传递进来的版本号中对应位置的值,那么这两个版本就不兼容。如果其中一个版本号比另一个长,那么在短的版本号中缺少的部分将被认为是零。例如,如果包的规范版本号是”1.4",并且我们用iscompatiblewith方法将其与”1.2","1.3.1'.或”.1.81.进行比较时,那么将返回true;但是如果与''1.4.2'.或”.5"进行比较,那么将返回false。之所以得出这样的结论,是因为这种比较机制假设规范版本是向后兼容的。

  实现的版本号没有规定的格式,因为提供实现的不同组织会对实现版本做不同的定义。在实现版本之间唯一能做的比较是测试版本是否相同,其中没有向下兼容的假设。

  包可以被密封起来,这意味着不能再向这个包中添加类了。未密封的包可以包含来自类搜索路径中多个不同位置的类,而被密封的包的内容必须来自相同的位置—要么是某个特定的归档文件,要么是由某个URL指定的位置。有两种方法可以确定一个包是否被密封了:

  .public boolean issealed p:如果该包被密封了,则返回trueo

  .public boolean issealed(URL url):如果该包对于给定的URL是密封的,则返回true,也就是说,该包中的类可以从这个给定的URL处加载。如果包中的类不能从给定的URL加载,或者包没有被密封,则返回false,包的规范和实现信息通常是作为与包存储在一起的清单文件的一部分而提供的—例如作为Java归档文件(jar)中的清单文件的一部分,就像25.9.2节“归档文件java.util.jar”中描述的那样。当加载包中类时,这些信息就会被读人。类加载器(ClassLoader)可以为它要加载的类动态地定义一个Package对象:

  我们可以调用给定类的Class对象的getPackage方法来获得这个类的Package对象。我们也可以用给定的包名调用静态方Package.getPackage来获得Package对象,或者调用静态方Package.getPackages,它将返回由类加载器当前已知的所有包组成Package数组。这两个方法都与调用它们的代码的类加载器有关,因为这些代码将调用其类加载器的get-Package或getPackages方法。这些类加载器的方法将搜索特定的类加载器及其所有父类加载器,如果对当前类加载器没有做任何设置,那么此时就会使用系统类加载器。请注意,如果包未知,那么类加载器方法将返回null,因为此时还没有加载包中的任何类型。

(0)

相关推荐

  • Java代码注释规范详解

    代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范. 2.注释内容准确简洁 内容要简单.明了.含义准确,防止注释的多义性,错误的注释不但无益反而有害. 3.基本注释(必须加) (a) 类(接口)的注释 (b) 构造函

  • JAVA语言编程格式高级规范

    作为一位开发人员,都要有严格的代码规范.为此我总结了一些代码规范案例. 目 录 1. 前言 2. 试用范围 3. JAVA命名规范-- 3.1 公共约定 3.2 Java文件.包 3.3 类.接口命名规范 3.4 方法命名规范 3.5 常量 3.6 变量和参数 3.7 组件/部件 3.8 集合 3.9 神秘的数 3.10 其他 3.11 Java异常 3.12 数组命名 3.13 数据库表命名规则 3.14 数据库字段命名规则 3.15 JSP文件命名 3.16 Servlet类命名 4. 书写

  • JAVA代码开发规范

    一.开发工具规范: 1. 开发工具经项目负责人调试后统一确定. 2. 开发工具一经确定不允许集成任何非统一插件,若有需要,经项目负责人同意后统一为 项目组成员添加. 3. 开发工具的编码格式不允许修改. 二.排版规范: 1. 关键词(或变量)和操作符之间加一个空格. 例如:int iCont = 1;//操作符和值之间有一个空格. 2. 相对独立的代码块与块之间加空行. 例如:两个方法之间需要用空格隔开. 3. 较长的语句.表达式等要分成多行书写. 4. 长表达式要在低优先级操作符处划分新行,操

  • 8种常见的Java不规范代码

    在工作上,我最近对一个现有的Java项目代码进行了清理.完成之后,我发现了一些反复出现的不规范代码.所以,我把它们整理成了一个列表出来分享给我的同行希望能引起注意并改善代码的质量和可维护性. 这个列表不区分顺序,全部来自一些代码质量检查工具,如 CheckStyle, FindBugs 和PMD. 在Eclipse中格式化源代码并管理import语句 Eclipse提供了自动格式化源代码和管理import语句的功能(并移除未使用的语句).你可以使用下面的快捷键来使用这些功能. Ctrl + Sh

  • Java Web项目前端规范(采用命名空间使js深度解耦合)

    没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的编码习惯总结了一套适用于javaweb项目的前端书写规范,与大家分享一下. ps:感谢阿海的创意,后期整理如下(附文件下载): 一.项目结构 这里和其他项目区别不大,我将模板抽离出来,更容易分析和理解: 解释一下:js主要包括extends(引入第三方的js).module(项目模块自己的js).l

  • Java命名规范

    编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{} 4. 变量名.方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写.(驼峰式) 如:int index=0; public void toString(){} 5. 常量名全部大写 如:public static final S

  • java开发命名规范总结

    使用前注意事项:1.由于Java面向对象编程的特性, 在命名时应尽量选择名词 2.驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首字母以小写开头,每个单词首字母大写(第一个单词除外). 如:myFirstName 一 包名的书写规范 (Package)推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性.包名全部为小写字母,且具有实际的区分意义. 1.1 一般要求1.选择有意义的名字,能快速地传达该类的

  • 详解Java编程中包package的内容与包对象的规范

    包的内容 包的内容应该仔细设计,使其只包含在功能上相关的类和接口.包中的类可以自由地访问该包中其他类的非私有成员,有些类甚至可能有足够的权限去访问其他类的内部细节,为了避免这样的类对类成员进行误操作,我们需要对类成员进行保护.任何没有被声明为private的成员都可以被同一个包中的其他所有类型访问,所以任何不相关的类之间的藕合程度都可能会比我们所期望的程度高. 包还为寻找有用的接口和类的程序员提供了逻辑分组的功能.由不相关的类组成的包使程序员很难分辨出哪些接口和类是有用的,而类的逻辑分组可以帮助

  • 详解Java编程中对象的序列化

    1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列化就能够帮助我们实现该功能. 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象.必须注意地是,对象序列化保存的是对象的"状态",

  • 详解Java编程中super关键字的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论this&super这两个关键字的意义和用法.在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当

  • 详解Java编程中JavaMail API的使用

    一.JavaMail API简介 JavaMail API是读取.撰写.发送电子信息的可选包.我们可用它来建立如Eudora.Foxmail.MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA).而不是像sendmail或者其它的邮件传输代理(Mail Transfer Agent,简称MTA)程序那样可以传送.递送.转发邮件.从另外一个角度来看,我们这些电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着MTA处理邮件的递送. 在清楚了到M

  • 举例详解Java编程中HashMap的初始化以及遍历的方法

    一.HashMap的初始化 1.HashMap 初始化的文艺写法    HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap<String, String> map = new HashMap<String, String>(); map.put("Name", "June"); map.put("QQ", "2572073701"

  • 详解Java编程中统一资源定位符URL的相关使用

    统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是:     <METHOD>://<HOSTNAME:PORT>/<PATH>/<FILE> 其中:Method是传输协议:HOSTNAME是文档和服务器所在的Internet主机名(域名系统中DNS中的点地址);PORT是服务端口号(可省略):PATH是路径名,FILE是文

  • 详解Java编程中final,finalize,finally的区别

    final: final可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一. final成员 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,二是在构造函数中,两者只能选其一. 下面程序很简单的演示了final的常规用

  • 详解Java编程中线程的挂起、恢复和终止的方法

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线程机制在Java 2和早期版本中有所不同.尽管你运用Java 2的途径编写代码,你仍需了解这些操作在早期Java环境下是如何完成的.例如,你也许需要更新或维护老的代码.你也需要了解为什么Java 2会有这样的变化.因为这些原因,下面内容描述了执行线程控制的原始方法,接着是Java 2的方法. Jav

  • 详解Java编程中对线程的中断处理

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制. 如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中断状态以及在方法中吞掉中断状态会有什么后果?Thread.st

  • 详解Java编程中protected修饰符与static修饰符的作用

    protected 来谈谈protected访问权限问题.看下面示例1: Test.java class MyObject {} public class Test { public static void main(String[] args) { MyObject obj = new MyObject(); obj.clone(); // Compile error. } } 此时出现上文提到的错误:The method clone from the type Object is not v

随机推荐