java中方法的参数可以是方法
呵呵,自己在骗自己,貌似C++中可以,java中是不可以的,但我们可以使用多态来实现
eg: test(IDaoMethod method)
接口IDaoMethod 中有个方法exec();
这样我们把我们的方法写在exec()中就可以了:
看个例子
public interface ExeDao {public void exec(Session session);}public class DaoTest {/** * @param args */public static void main(String[] args) { // new DaoTest().selectHotMoiveTest(); new DaoTest().selectHotMusicTest();}//主方法public void test(ExeDao exeDao){IDaoSession daoS=null;Session session=null;try{daoS=new IDaoSessionHbn();session=daoS.getSession(); //我在这exeDao.exec(session);}catch(Exception e){e.printStackTrace();}finally{daoS.closeSession();}}public void selectHotMoiveTest(){ //被传的方法1(这个类主要是为了包裹我们的具体方法)class exeDaoImp implements ExeDao{ IDaoMovie daoM=new IDaoMovieHbn(); List<Movie> movies=null;public void exec(Session session) { movies=daoM.selectHotMovie(6, session); for(Movie m:movies){ System.out.println("movie keyy is "+m.getKeyy()); }}}//我在这test(new exeDaoImp());} public void selectHotMusicTest(){ //被传的方法2class ExeDaoImp2 implements ExeDao{IDaoMusic daoM=new IDaoMusicHbn();List<Music> musics=null;public void exec(Session session) {musics=daoM.findHotMusic(10, "", session);for(Music m:musics){System.out.println(m.getKeyy());}}}//我在这test(new ExeDaoImp2());}}这个是我为了测试dao方便写的,希望新手进来交流,老手进来拍砖
public class Foo { private static void bar() { Integer[] array = new Integer[] { 2, 4, 3, 1, 0 }; Arrays.sort<Integer>(array, (Integer x, Integer y) => { return x - y; }); System.out.println("done!"); } public static void main(String[] args) { bar(); }}
注意到Arrays.sort那行的调用,第二个参数使用了闭包来实现原本Comparator<E>接口里的compare()方法。嗯这个例子可能不太好,因为Comparator<E>接口里有两个方法(另一个是equals());诶,顺便假设Comparator<E>里没有equals()方法,而是“单方法接口”吧。另外Arrays.sort()是有int[]版本的重载的,也暂时无视掉它吧……一时想不到啥好例子。
注意到上面例子里的return如果表示的是本地返回,则Arrays.sort()是调用方、闭包是被调用方,因而闭包的返回目标是Arrays.sort()。当然,执行完整个排序之后,控制流回到bar()里,然后继续执行println(),我们会看到done!。
但如果那个return是“非本地返回”呢?那么闭包里的return语句的返回目标就是bar()的调用者,在这里例子里也就是main();Arrays.sort()在调用那个闭包的时候就会遇到return语句,导致控制流跳出bar()直接回到main()。这样我们就不会看到done!的输出,排序也不会正确进行。事实上,如果return表示的是非本地返回,这段代码很可能无法编译:return语句的返回类型是Integer/int,而bar()的签名里写着返回类型是void,类型不匹配因而有问题。不过这个例子里请暂时忽略掉编译的成功与否的问题……反正这个闭包语法也是造出来的,呵呵。
OK,现在主流语言里支持闭包且支持非本地控制流的语言,其中一个例子就是Ruby。也是随便写个例子:
def foo [1, 2, 3].each { |i| return i if 0 == i % 2 } nilend这段代码里的return就是一个非本地返回,在遇到i是偶数的时候将i返回,否则在遍历完成后返回nil。(好孩子请直接用Enumerable#find ...)
而下面这段代码片段里的return则是传统的本地返回:
def foo(f) puts f.callenddef bar foo(lambda { return 'bar' }) puts 'done!'end所以执行完这段之后,我们可以看到输出bar和done!。(好孩子请不要在这里写return……省略return效果一样)
用个实用点的例子:
def foo i = 0 loop do break if 3 == i endend
这里,loop是Ruby标准库里的一个函数,而do...end中间的是一个block,也就是Ruby里的闭包。这里的break应该使控制流直接跳出loop回到foo,而不应该break回到loop里面。如果没有非本地控制流的语义,这个break就不好写了。
换句话说,在Ruby里,同样是Proc对象,return、break、next等控制流语句的语义是取决于该Proc对象是lambda还是普通的Proc;是lambda的话就是用本地控制流语义,反之则使用非本地控制流语义。
反对BGGA的Java程序员本恐惧这种怪怪的差异会撑爆它们的头脑,所以抗拒着。
而其它支持闭包的主流C-like语言里,C#、JavaScript、ActionScript 3等都只支持本地控制流语义,也是对这复杂性有所考虑的结果。嘛。def a yield puts 'a'enddef b a{return 'x'} puts 'b'endb
所以一般正常的 block 返回值应该用 yield 或者干脆不写…… 19 楼 night_stalker 2009-04-03 > <,没看上一页就相当然的 re 了……
出现这么多语法,都是因为我们打死了 goto …… 20 楼 RednaxelaFX 2009-04-03 night_stalker 写道> <,没看上一页就相当然的 re 了……
出现这么多语法,都是因为我们打死了 goto ……
“一般”的goto只能在局部作用域里跳转,你看C里要跨函数跳转还得longjmp。但Ruby的throw/catch就能做远程跳转,比“一般”的goto更goto了 XDD 21 楼 抛出异常的爱 2009-04-03 楼上是在比谁的设计更像外星人么 22 楼 kulinglei 2009-04-03 抛出异常的爱 写道楼上是在比谁的设计更像外星人么
感觉你穿西装好看,这个头像不好看哦 23 楼 wendong007 2009-04-03 <div class="quote_title">抛出异常的爱 写道</div>
<div class="quote_div">楼上是在比谁的设计更像外星人么</div>
<p>?</p>
<p>确实很火星</p> 24 楼 dch1287 2009-04-10 kulinglei 写道抛出异常的爱 写道楼上是在比谁的设计更像外星人么
感觉你穿西装好看,这个头像不好看哦
此人已死 有事烧纸 的那种