回憶一下,我在本文的開(kāi)頭,曾經(jīng)提到過(guò):"一個(gè)好的庫(kù)必須是一個(gè)緊湊的關(guān)系緊密的整體,而不是一個(gè)分散的關(guān)系松散的對(duì)象的集合。"從API說(shuō)明文檔所顯示的這個(gè)庫(kù)的樹(shù)形結(jié)構(gòu),并不能看出這些類之間的聯(lián)系。而從源代碼的角度,我們則可以清楚地看到這一點(diǎn)。在這一部分的討論中,我們 也明白了兩點(diǎn): 1、如何編寫(xiě)重載構(gòu)造函數(shù) 2、在一個(gè)類的實(shí)例中返回另外一個(gè)類的實(shí)例 接下來(lái),看看Matcher類。這個(gè)類實(shí)現(xiàn)了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函數(shù)。有什么作用?在后面我們將會(huì)討論到。 再看看Matcher的實(shí)現(xiàn)。
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 */
Matcher(Pattern regex){ //注重下面這一行,它說(shuō)明Matcher類的內(nèi)部有一個(gè)指向Pattern實(shí)例的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(); //} //定義了一些內(nèi)部的數(shù)據(jù),MemReg是一個(gè)有三個(gè)整數(shù)的類。類的聲明見(jiàn)下。 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