一個例子教你理解java回調機制


網上很多例子都寫的很難理解,筆者剛開始都已經弄暈菜了。

這個例子,應該是再簡單,再簡潔不過的了,例子目的是測試某個方法的執行時間。這里就寫三個java類,一個接口,一個實現,還有一個用於測試時間的類。

要測試的方法,盡量占用執行的時間,這樣明顯一些,這里測試循環1000000次,並且打印出來。

測試類:

public class MyMethod {

    public void mytest() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 1000000; i++) {
            System.out.println("num:"+i);
        }
    }
}

 

接口CallBack:

public interface CallBack {
    void execute();
}

 

實現類:

public class TestTime {
    public void testTime(CallBack callBack){
        long begin=System.currentTimeMillis();
        System.out.println("begin time:"+begin);
        callBack.execute();
        long end=System.currentTimeMillis();
        System.out.println("end time:"+end);
        System.out.println("use time:"+(end-begin));
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestTime TT=new TestTime();
        TT.testTime(new CallBack() {            
            @Override
            public void execute() {
                // TODO Auto-generated method stub
                (new MyMethod()).mytest(); //執行測試方法
            }
        });
}
}

控制台會輸出:

......

num:999998
num:999999
end time:1403838433171
use time:8093

好了,這就實現回調了。

剛接觸這個的,會覺得,這就是實現回調了?

筆者對回調的大致理解是:A調用了B,執行后,B又調用A。上面的實現類是寫在了一起。主類(A)的main方法調用了主類中的testTime方法(這個testTime可以單獨寫到一個類(B)中,就相當於B類中的方法,只不過這里寫到了一起),所以可以簡單理解為A調用了B。然后B又調用了A中的測試方法MyMethod.mytest()方法(消耗了很久時間,並且B自己計算了時間)。

這樣,大概就理解了吧。

使用回調有什么好處呢?

好處大概就是只關心自己的業務,不用在乎其它的東西。就像上面,計算方法執行時間的類,只需要調用一下它就好了,不用去管他是如何來執行,如何來實現那個計算方法的。如果用過jdbcTemplate的話,應該更容易理解一些。jdbctemplate也是使用回調的,用戶只需要關心對自己對象的操作,而不用關心其他的,比如連接數據庫,執行sql語句等問題。

推而廣之,我們大概可以寫一個jdbctemplate的簡單模型,比如數據庫的更新插入操作。

Callback的接口:

import com.mysql.jdbc.PreparedStatement;

public interface PreparedStatementSetter {
    public void setValues(PreparedStatement ps);
}

更新的方法:

import com.mysql.jdbc.PreparedStatement;

public class JdbcTemplate {
    public void update(String sql,PreparedStatementSetter pss) throws SQLException{
        PreparedStatement preparedStatement=null;
        preparedStatement.execute(sql);
    }
}

我們自己的方法去實現:

import java.sql.SQLException;

import com.mysql.jdbc.PreparedStatement;

public class Main {
    public Main() throws SQLException {
        // TODO Auto-generated constructor stub
        JdbcTemplate jdbcTemplate=new JdbcTemplate();
        String sql="insert into table values(?,?)";
        jdbcTemplate.update(sql, (new PreparedStatementSetter() {
            
            @Override
            public void setValues(PreparedStatement ps) {
                // TODO Auto-generated method stub
                
            }
        }));
    }
}

 

這和jdbctemplate是不是非常像,大概就是這么些。希望有助於很多像我一樣對回調迷茫了很久的人。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM