網上很多例子都寫的很難理解,筆者剛開始都已經弄暈菜了。
這個例子,應該是再簡單,再簡潔不過的了,例子目的是測試某個方法的執行時間。這里就寫三個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是不是非常像,大概就是這么些。希望有助於很多像我一樣對回調迷茫了很久的人。
