zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0
          今天在看
          http://www.aygfsteel.com/raylong1982/archive/2007/10/24/155439.html
          中關(guān)于內(nèi)部類(lèi)的介紹和分析的時(shí)候,就想到了我剛寫(xiě)的那個(gè)回答面試問(wèn)題的簡(jiǎn)單代碼,是不是也可以改用內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)呢?
          所以就做了一個(gè)簡(jiǎn)單的改進(jìn),代碼如下:
          package org.zy.demo;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.Timer;
          import java.util.TimerTask;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          public class ParseUrlUsingInnerClass {
          ???
          ???
          ???
          ??? public static void main(String[] args){
          ??? ??? Timer t = new Timer();
          ??? ??? t.schedule(new ParseTask(),0,5*60*60);??? ??? ???
          ??? }
          ???
          ???
          ??? class ParseTask extends TimerTask{

          ??? ??? public void run(){
          ??? ??? ??? System.out.println("runing");
          ??? ??? ??? try {
          ??? ??? ??? ??? // create url object
          ??? ??? ??? ??? URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");
          ??? ??? ??? ??? // get the input stream reader from the url
          ??? ??? ??? ??? InputStreamReader isr = new InputStreamReader(url.openStream());
          ??? ??? ??? ??? // buffered the reader
          ??? ??? ??? ??? BufferedReader br = new BufferedReader(isr);
          ??? ??? ??? ???
          ??? ??? ??? ??? // store the temp string
          ??? ??? ??? ??? StringBuffer sb = new StringBuffer(10000);
          ??? ??? ??? ??? // temporary variable for each read
          ??? ??? ??? ??? String tmp="";
          ??? ??? ??? ???
          ??? ??? ??? ??? // read the content from reader
          ??? ??? ??? ??? while((tmp=br.readLine())!=null){
          ??? ??? ??? ??? ??? sb.append(tmp);
          ??? ??? ??? ??? }
          ??? ??? ??? ??? System.out.println(sb.toString());
          ??? ??? ??? ??? // match from the orginal string using? reglex express
          ??? ??? ??? ??? Pattern p = Pattern.compile("<<.*異人.*>>");
          ??? ??? ??? ??? Matcher m = p.matcher(sb.toString());??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? } catch (MalformedURLException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? } catch (IOException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? }
          ??? ??? }
          ??? }
          }

          看藍(lán)色代碼部分,很顯然,我直接作了一個(gè)最簡(jiǎn)單的修改,就是直接把外面定義的拿給類(lèi)拿到了public類(lèi)的里面,其他的代碼都沒(méi)有改變。
          但是代碼卻出現(xiàn)了問(wèn)題。
          ??? public static void main(String[] args){
          ??? ??? Timer t = new Timer();
          ??? ??? t.schedule(new ParseTask(),0,5*60*60);??? ??? ???
          ??? }
          上面的這段代碼就出現(xiàn)了問(wèn)題,為什么呢?
          我們知道,一個(gè)static的方法,只能使用static屬性和方法和static類(lèi),那么
          new ParseTask()能行嗎?
          問(wèn)題就出在這,此處不能創(chuàng)建一個(gè)非靜態(tài)類(lèi)的對(duì)象。
          所以,我們就只能在類(lèi)的定義前面添加一個(gè)static,讓其成為一個(gè)靜態(tài)類(lèi)就可以了。
          修改后的代碼如下:
          static class ParseTask extends TimerTask{
          一般情況下,我們不創(chuàng)建static類(lèi),這個(gè)地方是因?yàn)槲覀冊(cè)趕tatic main 方法里面直接使用,所以就只能創(chuàng)建靜態(tài)類(lèi)。
          我們的代碼還可以改變:
          可以把調(diào)用部分封裝成一個(gè)方法,然后在此方法里面調(diào)用內(nèi)部類(lèi),就可以不用定義靜態(tài)類(lèi)了,代碼如下:

          package org.zy.demo;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.Timer;
          import java.util.TimerTask;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          public class ParseUrlUsingInnerClass1 {
          ???
          ??? public void parseUrl(){
          ??? ??? Timer t = new Timer();
          ??? ??? t.schedule(new ParseTask(),0,5*60*60);??? ???
          ??? }
          ???
          ??? public static void main(String[] args){
          ??? ??? ParseUrlUsingInnerClass1 puic = new ParseUrlUsingInnerClass1();
          ??? ??? puic.parseUrl();
          ??? }
          ???
          ???
          ??? class ParseTask extends TimerTask{

          ??? ??? public void run(){
          ??? ??? ??? System.out.println("runing");
          ??? ??? ??? try {
          ??? ??? ??? ??? // create url object
          ??? ??? ??? ??? URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");
          ??? ??? ??? ??? // get the input stream reader from the url
          ??? ??? ??? ??? InputStreamReader isr = new InputStreamReader(url.openStream());
          ??? ??? ??? ??? // buffered the reader
          ??? ??? ??? ??? BufferedReader br = new BufferedReader(isr);
          ??? ??? ??? ???
          ??? ??? ??? ??? // store the temp string
          ??? ??? ??? ??? StringBuffer sb = new StringBuffer(10000);
          ??? ??? ??? ??? // temporary variable for each read
          ??? ??? ??? ??? String tmp="";
          ??? ??? ??? ???
          ??? ??? ??? ??? // read the content from reader
          ??? ??? ??? ??? while((tmp=br.readLine())!=null){
          ??? ??? ??? ??? ??? sb.append(tmp);
          ??? ??? ??? ??? }
          ??? ??? ??? ??? System.out.println(sb.toString());
          ??? ??? ??? ??? // match from the orginal string using? reglex express
          ??? ??? ??? ??? Pattern p = Pattern.compile("<<.*異人.*>>");
          ??? ??? ??? ??? Matcher m = p.matcher(sb.toString());??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? } catch (MalformedURLException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? } catch (IOException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? }
          ??? ??? }
          ??? }
          }
          看綠色代碼部分就可以知道了。
          對(duì)于方法的改進(jìn),我們可以給parseUrl加上一個(gè)參數(shù)URL,那么,其他的相對(duì)應(yīng)的部分也要做一些簡(jiǎn)單的修改,代碼如下:
          package org.zy.demo;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.Timer;
          import java.util.TimerTask;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          public class ParseUrlUsingInnerClass2 {
          ???
          ??? public void parseUrl(URL url){
          ??? ??? Timer t = new Timer();
          ??? ??? t.schedule(new ParseTask(url),0,5*60*60);??? ???
          ??? }

          ???
          ??? public static void main(String[] args){
          ??? ??? ParseUrlUsingInnerClass2 puic = new ParseUrlUsingInnerClass2();
          ??? ???
          ??? ??? try {
          ??? ??? ??
          URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");
          ??? ??? ??? puic.parseUrl(url);

          ??? ??? } catch (MalformedURLException e) {
          ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? e.printStackTrace();
          ??? ??? }
          ???
          ??? }
          ???
          ???
          ??? class ParseTask extends TimerTask{
          ??? ??? URL url;
          ??? ??? public ParseTask(URL url){
          ??? ??? ??? this.url = url;
          ??? ??? }

          ??? ??? public void run(){
          ??? ??? ??? System.out.println("runing");
          ??? ??? ??? try {
          ??? ??? ??? ??? // create url object
          ??? ??? ??? ??? //URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");
          ??? ??? ??? ??? // get the input stream reader from the url
          ??? ??? ??? ??? InputStreamReader isr = new InputStreamReader(this.url.openStream());
          ??? ??? ??? ??? // buffered the reader
          ??? ??? ??? ??? BufferedReader br = new BufferedReader(isr);
          ??? ??? ??? ???
          ??? ??? ??? ??? // store the temp string
          ??? ??? ??? ??? StringBuffer sb = new StringBuffer(10000);
          ??? ??? ??? ??? // temporary variable for each read
          ??? ??? ??? ??? String tmp="";
          ??? ??? ??? ???
          ??? ??? ??? ??? // read the content from reader
          ??? ??? ??? ??? while((tmp=br.readLine())!=null){
          ??? ??? ??? ??? ??? sb.append(tmp);
          ??? ??? ??? ??? }
          ??? ??? ??? ??? System.out.println(sb.toString());
          ??? ??? ??? ??? // match from the orginal string using? reglex express
          ??? ??? ??? ??? Pattern p = Pattern.compile("<<.*異人.*>>");
          ??? ??? ??? ??? Matcher m = p.matcher(sb.toString());??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? ???
          ??? ??? ??? } catch (MalformedURLException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? } catch (IOException e) {
          ??? ??? ??? ??? // TODO Auto-generated catch block
          ??? ??? ??? ??? e.printStackTrace();
          ??? ??? ??? }
          ??? ??? }
          ??? }
          }

          上面在用到此URL的地方和參數(shù)傳遞的地方都要做相應(yīng)的修改,比如說(shuō)
          ParseTask類(lèi)的構(gòu)造器,都要做些修改。
          上面的類(lèi)的定義和方法的定義,已經(jīng)可以實(shí)現(xiàn)減少部分耦合了。其實(shí)在run方法里面,如果從代碼重用的角度來(lái)看的話(huà),那么我們還可以進(jìn)行代碼改進(jìn)和重構(gòu)。
          就上面的一個(gè)demo,我們也可以簡(jiǎn)單的看到在類(lèi)的設(shè)計(jì)中,我們還是有很多的問(wèn)題要考慮,還是有很多的細(xì)節(jié)可以注意,來(lái)提高我們的代碼質(zhì)量。
          以上僅是一點(diǎn)簡(jiǎn)單的理解。






          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來(lái)源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-10-25 11:19 zhyiwww 閱讀(909) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): java basic

          FeedBack:
          # re: 從類(lèi)的改造小談內(nèi)部類(lèi)
          2009-11-11 19:03 | s
          發(fā)表任何與政治相關(guān)的內(nèi)容  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 洪泽县| 江津市| 长子县| 黔西| 布拖县| 龙胜| 图们市| 泰顺县| 波密县| 峨眉山市| 富蕴县| 阿拉善左旗| 尉犁县| 那坡县| 远安县| 抚顺县| 织金县| 福建省| 黑龙江省| 黄大仙区| 遵义市| 阜新| 剑河县| 定襄县| 五指山市| 梅河口市| 华宁县| 临夏县| 石门县| 阿克苏市| 南丰县| 宁乡县| 沙雅县| 广宗县| 吉林市| 灵寿县| 扬中市| 大丰市| 正镶白旗| 昔阳县| 斗六市|