今天在看
http://www.aygfsteel.com/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.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|