zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0
今天在看
http://www.blogjava.net/raylong1982/archive/2007/10/24/155439.html
中关于内部类的介绍和分析的时候,就想到了我刚写的那个回答面试问题的简单代码,是不是也可以改用内部类来实现呢?
所以就做了一个简单的改进,代码如下:
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();
            }
        }
    }
}

看蓝色代码部分,很显然,我直接作了一个最简单的修改,就是直接把外面定义的拿给类拿到了public类的里面,其他的代码都没有改变。
但是代码却出现了问题。
    public static void main(String[] args){
        Timer t = new Timer();
        t.schedule(new ParseTask(),0,5*60*60);           
    }
上面的这段代码就出现了问题,为什么呢?
我们知道,一个static的方法,只能使用static属性和方法和static类,那么
new ParseTask()能行吗?
问题就出在这,此处不能创建一个非静态类的对象。
所以,我们就只能在类的定义前面添加一个static,让其成为一个静态类就可以了。
修改后的代码如下:
static class ParseTask extends TimerTask{
一般情况下,我们不创建static类,这个地方是因为我们在static main 方法里面直接使用,所以就只能创建静态类。
我们的代码还可以改变:
可以把调用部分封装成一个方法,然后在此方法里面调用内部类,就可以不用定义静态类了,代码如下:

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();
            }
        }
    }
}
看绿色代码部分就可以知道了。
对于方法的改进,我们可以给parseUrl加上一个参数URL,那么,其他的相对应的部分也要做一些简单的修改,代码如下:
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的地方和参数传递的地方都要做相应的修改,比如说
ParseTask类的构造器,都要做些修改。
上面的类的定义和方法的定义,已经可以实现减少部分耦合了。其实在run方法里面,如果从代码重用的角度来看的话,那么我们还可以进行代码改进和重构。
就上面的一个demo,我们也可以简单的看到在类的设计中,我们还是有很多的问题要考虑,还是有很多的细节可以注意,来提高我们的代码质量。
以上仅是一点简单的理解。






|----------------------------------------------------------------------------------------|
                           版权声明  版权所有 @zhyiwww
            引用请注明来源 http://www.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2007-10-25 11:19 zhyiwww 阅读(903) 评论(1)  编辑  收藏 所属分类: java basic

FeedBack:
# re: 从类的改造小谈内部类
2009-11-11 19:03 | s
发表任何与政治相关的内容  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: