服务热线:13616026886

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

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

如何用java编写自己的库(3)


  回忆一下,我在本文的开头,曾经提到过:"一个好的库必须是一个紧凑的关系紧密的整体,而不是一个分散的关系松散的对象的集合。"从api说明文档所显示的这个库的树形结构,并不能看出这些类之间的联系。而从源代码的角度,我们则可以清楚地看到这一点。在这一部分的讨论中,我们 也明白了两点:
  1、如何编写重载构造函数
  2、在一个类的实例中返回另外一个类的实例
  接下来,看看matcher类。这个类实现了matchresult interface. 看看matchresult的定义:
  [games]$javap -classpath .. -s jregex.matchresult
  compiled from jregex/matchresult.java
  public interface jregex.matchresult
  /* acc_super bit not set */
  {
  public static final int match;
  /* i */
  public static final int prefix;
  /* i */
  public static final int suffix;
  /* i */
  public static final int target;
  /* i */
  public abstract jregex.pattern pattern();
  /* ()ljregex/pattern; */
  public abstract int groupcount();
  /* ()i */
  public abstract boolean iscaptured();
  /* ()z */
  public abstract boolean iscaptured(int);
  /* (i)z */
  public abstract boolean iscaptured(java.lang.string);
  /* (ljava/lang/string;)z */
  public abstract java.lang.string group(int);
  /* (i)ljava/lang/string; */
  public abstract boolean getgroup(int, java.lang.stringbuffer);
  /* (iljava/lang/stringbuffer;)z */
  public abstract boolean getgroup(int, jregex.textbuffer);
  /* (iljregex/textbuffer;)z */
  public abstract java.lang.string group(java.lang.string);
  /* (ljava/lang/string;)ljava/lang/string; */
  public abstract boolean getgroup(java.lang.string, java.lang.stringbuffer);
  /* (ljava/lang/string;ljava/lang/stringbuffer;)z */
  public abstract boolean getgroup(java.lang.string, jregex.textbuffer);
  /* (ljava/lang/string;ljregex/textbuffer;)z */
  public abstract java.lang.string prefix();
  /* ()ljava/lang/string; */
  public abstract java.lang.string suffix();
  /* ()ljava/lang/string; */
  public abstract java.lang.string target();
  /* ()ljava/lang/string; */
  public abstract int targetstart();
  /* ()i */
  public abstract int targetend();
  /* ()i */
  public abstract char targetchars()[];
  /* ()[c */
  public abstract int start();
  /* ()i */
  public abstract int end();
  /* ()i */
  public abstract int length();
  /* ()i */
  public abstract int start(int);
  /* (i)i */
  public abstract int end(int);
  /* (i)i */
  public abstract int length(int);
  /* (i)i */
  public abstract char charat(int);
  /* (i)c */
  public abstract char charat(int, int);
  /* (ii)c */
  }
  jregex.matchresult定义了一些abstract函数。有什么作用?在后面我们将会讨论到。
  再看看matcher的实现。
  
  games]$javap -classpath .. -s jregex.matcher
  compiled from jregex/matcher.java
  public class jregex.matcher extends java.lang.object implements jregex.matchresult {
  public static final int anchor_start;
  /* i */
  public static final int anchor_lastmatch;
  /* i */
  public static final int anchor_end;
  /* i */
  public static final int accept_incomplete;
  /* i */
  jregex.matcher(jregex.pattern);
  /* (ljregex/pattern;)v */
  public final void settarget(jregex.matcher, int);
  /* (ljregex/matcher;i)v */
  public void settarget(java.lang.string);
  /* (ljava/lang/string;)v */
  public void settarget(java.lang.string, int, int);
  /* (ljava/lang/string;ii)v */
  public void settarget(char[], int, int);
  /* ([cii)v */
  public final void settarget(char[], int, int, boolean);
  /* ([ciiz)v */
  public void settarget(java.io.reader, int) throws java.io.ioexception;
  /* (ljava/io/reader;i)v */
  public final boolean isstart();
  /* ()z */
  public final boolean matches();
  /* ()z */
  public final boolean matches(java.lang.string);
  /* (ljava/lang/string;)z */
  public void setposition(int);
  /* (i)v */
  public final boolean find();
  /* ()z */
  public final boolean find(int);
  /* (i)z */
  public jregex.matchiterator findall();
  /* ()ljregex/matchiterator; */
  public jregex.matchiterator findall(int);
  /* (i)ljregex/matchiterator; */
  public final boolean proceed();
  /* ()z */
  public final boolean proceed(int);
  /* (i)z */
  public final void skip();
  /* ()v */
  public java.lang.string tostring();
  /* ()ljava/lang/string; */
  public jregex.pattern pattern();
  /* ()ljregex/pattern; */
  public java.lang.string target();
  /* ()ljava/lang/string; */
  public char targetchars()[];
  /* ()[c */
  public int targetstart();
  /* ()i */
  public int targetend();
  /* ()i */
  public char charat(int);
  /* (i)c */
  public char charat(int, int);
  /* (ii)c */
  public final int length();
  /* ()i */
  public final int start();
  /* ()i */
  public final int end();
  /* ()i */
  public java.lang.string prefix();
  /* ()ljava/lang/string; */
  public java.lang.string suffix();
  /* ()ljava/lang/string; */
  public int groupcount();
  /* ()i */
  public java.lang.string group(int);
  /* (i)ljava/lang/string; */
  public java.lang.string group(java.lang.string);
  /* (ljava/lang/string;)ljava/lang/string; */
  public boolean getgroup(int, jregex.textbuffer);
  /* (iljregex/textbuffer;)z */
  public boolean getgroup(java.lang.string, jregex.textbuffer);
  /* (ljava/lang/string;ljregex/textbuffer;)z */
  public boolean getgroup(int, java.lang.stringbuffer);
  /* (iljava/lang/stringbuffer;)z */
  public boolean getgroup(java.lang.string, java.lang.stringbuffer);
  /* (ljava/lang/string;ljava/lang/stringbuffer;)z */
  public java.lang.string groups()[];
  /* ()[ljava/lang/string; */
  public java.util.vector groupv();
  /* ()ljava/util/vector; */
  public final boolean iscaptured();
  /* ()z */
  public final boolean iscaptured(int);
  /* (i)z */
  public final boolean iscaptured(java.lang.string);
  /* (ljava/lang/string;)z */
  public final int length(int);
  /* (i)i */
  public final int start(int);
  /* (i)i */
  public final int end(int);
  /* (i)i */
  public java.lang.string tostring_d();
  /* ()ljava/lang/string; */
  static {};
  /* ()v */
  
  
  先来看看它的构造函数,这个函数在pattern中被调用用来构造matcher类的实例。
  
  matcher(pattern regex){
  //注意下面这一行,它说明matcher类的内部有一个指向pattern实例的reference.
  this.re=regex;
  //int memregcount=(memregs=new memreg[regex.memregs]).length;
  //for(int i=0;i // this.memregs[i]=new memreg(-1); //unlikely to searchentry, in this case we know memreg indicies by d
  efinition
  //}
  //counters=new int[regex.counters];
  //int lookaheadcount=(lookaheads=new laentry[regex.lookaheads]).length;
  //for(int i=0;i // this.lookaheads[i]=new laentry();
  //}
  //定义了一些内部的数据,memreg是一个有三个整数的类。类的声明见下。
  int memregcount,countercount,lookaheadcount;
  if((memregcount=regex.memregs)>0){
  memreg[] memregs=new memreg[memregcount];
  for(int i=0;i memregs[i]=new memreg(-1); //unlikely to searchentry, in this case we know memreg indicies by defin
  ition
  }
  this.m

扫描关注微信公众号