今天在看
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