服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java 库的建立方法及其实例(2)


  java 库的建立方法及其实例(2)

设计原则一:封装

一个好的库必须是一个紧凑的关系紧密的整体,而不是一个分散的关系松散的对象的集合。

package是java提供的一种类库的封装机制。一个package是一个java类文件的集合,存放在同一个目 录中。package有专有的名字空间。

专有的名字空间的一个好处是,你不用担心名称的冲突。因为,如果你的类的名称和别人的类的名 称冲突,但是他们不在同一个package中,利用这一点可以避免名字的冲突。

每一个package都有一个字符串来代表,比如java.lang, 或者javax.swing.plaf.basic.实际上每一个类的 全名都是由package的名字加上类的名字来代表的,这样就避免了名字的冲突,比 如,java.lang.object或者javax.swing.plaf.basic.basicmenubarui.

注意,有一个特殊的package叫做default package。如果你不声明你的类属于任何一个package,那么 它就被假定属于default package.

每一个package的名字都对应一个目录。比如,java.lang.object 存放在java/lang/object.java中,每一 个.对应一个/. default package存放的目录是当前目录。

声明一个package.

// server.java



package mylib;



public class server implements runnable

{

// ...

如果有import语句,必须放在package语句的后面。



当然你也可以引入别的package. 例如:

import mylib.server;



// ...



server server = new server( portnum );

java允许你决定package中的哪些类对外部是可见的。public类可以被包外的代码使用,而private类 则不行。

比如,让server类能被外部的代码使用:

// server.java



package mylib;



import java.io.*;

import java.net.*;



public class server implements runnable

{

如果你不想让类被外部的代码使用,可以用缺省的属性,去掉public. 例如:



// reporter.java



package mylib;



class reporter implements runnable

{



设计原则二:继承

在我们的例子中,server是主要的类。如果你看这个类的代码,就能看到,它本身其实什么也不 做。主循环用来监听连接。当连接建立以后,它把处理连接的任务交给一个叫做handleconnection() 的函数。

// subclass must supply an implementation

abstract public void handleconnection( socket s );

因为没有实现这一函数,所以这个类被声明为abstract,使用者必须实现这个函数。



// this is called by the server class when a connection

// comes in. "in" and "out" come from the incoming socket

// connection

public void handleconnection( socket socket ) {

try {

inputstream in = socket.getinputstream();

outputstream out = socket.getoutputstream();



// just copy the input to the output

while (true)

out.write( in.read() );



} catch( ioexception ie ) {

system.out.println( ie );

}

}



可以说,这一继承的过程叫做定制。因为在server类中,并没有定义该函数的动作,而是把这个定 义的过程留给使用者,让他们来完成所需要的特定的功能。

另外一个定制函数:cleanup().

在设计类的时候,往往你能考虑到使用者需要的功能,例如上面的handleconnection().但是,也需要 考虑另外一种定制,例如在这里,在server退出后台运行方式的时候,调用了这个cleanup()函数, 在server类中的实现为空,什么都不做,这把机会留给使用者,使用者可以用这个函数来做一些清 除工作,这种函数也可以称之为"钩子"。

设计原则三:调试

没有人能够做到写出一个绝对完美的程序,没有任何的错误。所以,调试是不可缺少的。有时候, 使用者可能会遇到一个问题,从而需要知道在库的代码中发生了什么问题。这个错误可能是库代码 的问题,也可能是使用者的代码在库代码中引起的问题。

如果你提供了库的源代码,使用者可以用debugger来调试错误。但是,你不能完全依赖于调试器。 在库代码中加入打印调试信息的语句,是一个好习惯。它可以帮助使用者明白,什么地方发生了错 误。
(未完待续)

扫描关注微信公众号