`
kulinglei
  • 浏览: 101353 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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(){
		 //被传的方法2

		class 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方便写的,希望新手进来交流,老手进来拍砖




    
分享到:
评论
24 楼 dch1287 2009-04-10  
kulinglei 写道
抛出异常的爱 写道
楼上是在比谁的设计更像外星人么

感觉你穿西装好看,这个头像不好看哦

此人已死 有事烧纸 的那种
23 楼 wendong007 2009-04-03  
<div class="quote_title">抛出异常的爱 写道</div>
<div class="quote_div">楼上是在比谁的设计更像外星人么</div>
<p> </p>
<p>确实很火星</p>
22 楼 kulinglei 2009-04-03  
抛出异常的爱 写道
楼上是在比谁的设计更像外星人么

感觉你穿西装好看,这个头像不好看哦
21 楼 抛出异常的爱 2009-04-03  
楼上是在比谁的设计更像外星人么
20 楼 RednaxelaFX 2009-04-03  
night_stalker 写道
> <,没看上一页就相当然的 re 了……

出现这么多语法,都是因为我们打死了 goto ……

“一般”的goto只能在局部作用域里跳转,你看C里要跨函数跳转还得longjmp。但Ruby的throw/catch就能做远程跳转,比“一般”的goto更goto了 XDD
19 楼 night_stalker 2009-04-03  
> <,没看上一页就相当然的 re 了……

出现这么多语法,都是因为我们打死了 goto ……
18 楼 night_stalker 2009-04-03  
RednaxelaFX 写道
night_stalker 写道
那个可以跳出n层,多好…… 平时尽量少用 return 避免烦恼……

是撒,写Ruby代码的时候我好久没需要写过return了。看到那些每个方法里都有return的Ruby代码风格还不习惯 T T
不过要跳出n层还是得靠throw/catch吧?……


一般的throw/catch是一个方法。

return 可以无视 block 直接进行方法返回。try this:
def a
  yield
  puts 'a'
end

def b
  a{return 'x'}
  puts 'b'
end

b


所以一般正常的 block 返回值应该用 yield 或者干脆不写……
17 楼 RednaxelaFX 2009-04-02  
night_stalker 写道
那个可以跳出n层,多好…… 平时尽量少用 return 避免烦恼……

是撒,写Ruby代码的时候我好久没需要写过return了。看到那些每个方法里都有return的Ruby代码风格还不习惯 T T
不过要跳出n层还是得靠throw/catch吧?……
16 楼 night_stalker 2009-04-02  
RednaxelaFX 写道
kimmking 写道
不过java的衍生语言  groovy支持闭包哈~~~

嗯,不过Groovy的闭包与C#、JavaScript一样只有本地跳转语义,而不像Ruby那样同时拥有本地和非本地跳转语义。所以Groovy程序员不会被怪怪的非本地跳转把脑子撑爆 XDD


那个可以跳出n层,多好…… 平时尽量少用 return 避免烦恼……
15 楼 RednaxelaFX 2009-04-02  
由VM直接支持的动态方法分发(dynamic method dispatch)再怎么慢,或者说反射再怎么快,也肯定是前者比后者快;且不提Java中反射调用方法的开销比正常的方法调用大不少。所以在Java里要“传递方法”的话,策略模式还是比反射来得顺畅
14 楼 量产型人型自走炮 2009-04-02  
那个...传方法的话 直接反射后传Method不就行了吗...
13 楼 RednaxelaFX 2009-04-02  
kimmking 写道
不过java的衍生语言  groovy支持闭包哈~~~

嗯,不过Groovy的闭包与C#、JavaScript一样只有本地跳转语义,而不像Ruby那样同时拥有本地和非本地跳转语义。所以Groovy程序员不会被怪怪的非本地跳转把脑子撑爆 XDD
12 楼 wendong007 2009-04-02  
<div class="quote_title">抛出异常的爱 写道</div>
<div class="quote_div">
<div class="quote_title">kimmking 写道</div>
<div class="quote_div">
<div class="quote_title">抛出异常的爱 写道</div>
<div class="quote_div">java中的死脑子真的很多....<br />不过他们对新技术的培训预计一点也不过分<br /><br />java老虎在笼子中是现在jdk的最好形容.<br />空有好的想法/牛X的语法 但没办法快速推广.</div>
<br />不过java的衍生语言  groovy支持闭包哈~~~</div>
<br />有个同志写了<br /><br />一个java版的C的语义解释器.....<br />说是是大学毕设时把题目看反了..<br /><br /></div>
<p> </p>
<p>强悍!!!</p>
11 楼 抛出异常的爱 2009-04-02  
kimmking 写道
抛出异常的爱 写道
java中的死脑子真的很多....
不过他们对新技术的培训预计一点也不过分

java老虎在笼子中是现在jdk的最好形容.
空有好的想法/牛X的语法 但没办法快速推广.

不过java的衍生语言  groovy支持闭包哈~~~

有个同志写了

一个java版的C的语义解释器.....
说是是大学毕设时把题目看反了..

10 楼 kimmking 2009-04-02  
抛出异常的爱 写道
java中的死脑子真的很多....
不过他们对新技术的培训预计一点也不过分

java老虎在笼子中是现在jdk的最好形容.
空有好的想法/牛X的语法 但没办法快速推广.

不过java的衍生语言  groovy支持闭包哈~~~
9 楼 抛出异常的爱 2009-03-31  
java中的死脑子真的很多....
不过他们对新技术的培训预计一点也不过分

java老虎在笼子中是现在jdk的最好形容.
空有好的想法/牛X的语法 但没办法快速推广.
8 楼 RednaxelaFX 2009-03-31  
kulinglei 写道
你太牛了,能不能说说,你是哪个学校的啊,莫非传说中的水木清华?????

多用几年Java,读读书,在实际代码中吃点亏之类的,应该能知道这些知识的。这跟牛不牛没关系……JE上的牛人多的是了呢,呵呵。另外我是南京大学的,呃呵呵 =v=

kulinglei 写道
我也感觉java中应该有闭包的。对闭包也只是停留在概念阶段,呵呵

Java中加入闭包可能迟了点,只能这么说。已经有太大的历史包袱压在语言上,而且社区内对新的语言结构总是持抗拒态度的人多,所以……不好说。
Java的闭包方案中,BGGA方案是最强大但也最复杂的。这个方案想“要做就一口气做彻底”,或许彻底过头了。在函数式语言中,因为不强调控制流的概念(而是使用递归和高阶函数来实现控制流),所以没有“非本地返回”(non-local return)的问题;在许多支持闭包的命令式语言中,嵌套函数中return的语义也是跟普通函数一样,只做“本地返回”。(local return)

本地返回和非本地返回是什么意思呢?用例子来说明:
假设Java支持闭包,那么我们很可能可以写出:
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 }
  nil
end

这段代码里的return就是一个非本地返回,在遇到i是偶数的时候将i返回,否则在遍历完成后返回nil。(好孩子请直接用Enumerable#find ...)
而下面这段代码片段里的return则是传统的本地返回:
def foo(f)
  puts f.call
end

def bar
  foo(lambda { return 'bar' })
  puts 'done!'
end

所以执行完这段之后,我们可以看到输出bar和done!。(好孩子请不要在这里写return……省略return效果一样)

用个实用点的例子:
def foo
  i = 0
  loop do
    break if 3 == i
  end
end

这里,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等都只支持本地控制流语义,也是对这复杂性有所考虑的结果。嘛。
7 楼 kulinglei 2009-03-31  
我也感觉java中应该有闭包的。对闭包也只是停留在概念阶段,呵呵
6 楼 kulinglei 2009-03-31  
RednaxelaFX 写道
咪……读过设计模式相关资料的话会知道这是个策略模式的应用,帅是帅,不过90年代中期被GoF总结出来之后大家也就是这么用着,呃呵呵。

关于Java中是否应该引入闭包的争论,hmm,某种程度上说策略模式是闭包的退化形态,所以有人想要更简洁的语法得到更强的能力,就想到该往Java里加入闭包了。难说这对Java来说会不会重复泛型的糟糕……

你太牛了,能不能说说,你是哪个学校的啊,莫非传说中的水木清华?????
5 楼 RednaxelaFX 2009-03-28  
咪……读过设计模式相关资料的话会知道这是个策略模式的应用,帅是帅,不过90年代中期被GoF总结出来之后大家也就是这么用着,呃呵呵。

关于Java中是否应该引入闭包的争论,hmm,某种程度上说策略模式是闭包的退化形态,所以有人想要更简洁的语法得到更强的能力,就想到该往Java里加入闭包了。难说这对Java来说会不会重复泛型的糟糕……

相关推荐

    java方法的参数传递其二.docx

    Java 方法参数传递之引用类型 Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法...

    java传递参数的方法

    java传递参数的方法 很的东西 大家下载学习一下

    Java语言的方法参数浅析

    参数传递是Java语言中函数调用的重要步骤,清楚地了解参数传递的过程是编写出高质量程序所必须的.大多数程序设计语言具有传值调用和传引用调用的两种方法.通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    4. **调用私有方法**:现在我们可以调用私有方法了,这需要使用`invoke()`方法,传入目标对象实例和方法的参数。如果`myPrivateMethod`是静态方法,则不需要传入实例。例如:`privateMethod.invoke(myInstance, 123)...

    C以及Java中可变参数列表函数定义方法

    例如,Java的可变参数必须是同一类型的,而C语言的可变参数可以是任意类型。 总结来说,C语言和Java都提供了处理可变参数列表的方法,但实现机制有所不同。C语言使用了更底层的`stdarg.h`库,而Java则提供了更高级...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。

    Java解析wsdl文档获取具体的方法与参数

    Java作为一种广泛使用的编程语言,提供了处理WSDL文档的能力,帮助开发者获取服务中的方法和参数信息。本篇将深入探讨如何在Java中解析WSDL文档并提取关键细节。 首先,理解WSDL文档的结构至关重要。WSDL文档包含了...

    Java数组传递及可变参数操作实例详解

    Java 可变参数是指在方法中可以传递同类型的可变参数,JDK 1.5 开始支持这种特性。可变参数可以使得方法更加灵活、方便使用。可变参数的使用规则包括:可以不写参数,即传入空参;可以直接在里边写入参数,参数间用...

    浅谈Java中方法的参数传值.pdf

    综上所述,通过Java方法参数传递的知识点,我们可以更深入地理解Java程序的运行机制以及变量、数据类型和方法调用之间的关系。这不仅帮助编程者更好地组织代码结构,还能够在调试过程中快速定位问题所在,提高开发...

    java实现根据方法查看方法参数名称

    在visitParameter方法中,可以获取到参数的顺序和类型,但不包括名称。要获取名称,我们需要在解析时利用注解处理器,因为参数名称通常在调试信息(如LocalVariableTable属性)中存储,这部分信息可以通过...

    JAVA中的方法重写与方法重载区别

    方法重载(Overload)是指在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。 在 JAVA 中,方法...

    java修改请求参数

    在`doFilter()`方法中,可以读取原始请求参数,进行修改,然后使用`HttpServletRequestWrapper`包装修改后的参数,再继续请求链。 3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的...

    56.java带参数方法定义.zip

    56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip56.java带参数方法定义.zip...

    57.java带参数方法调用.zip

    57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip...

    java解析wsdl文档获取方法与参数

    5. 获取方法参数:在`MessagePartInfo`中,你可以找到操作的参数信息,通常与Java类型相关联。 ```java QName elementName = part.getElementName(); SchemaType type = part.getType(); String javaType = part....

    java实现七参数转换功能

    本篇将深入探讨“七参数转换”在Java中的实现,并通过名为"SevenParamsDemo"的示例程序进行详细讲解。 七参数转换是一种解决地心坐标系之间转换的方法,它包括三个平移参数(x、y、z)、三个旋转参数(α、β、γ)...

    Java --- 方法参数为接口(子类实现接口中重写后的方法流程图)

    Java --- 方法参数为接口(子类实现接口中重写后的方法流程图)

    java 带两个类型参数的泛型

    在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和可复用性。当我们谈论“java带两个类型参数的泛型”时,这意味着我们正在处理一个泛型类或泛型方法,...

    java可变参数

    Java可变参数是Java语言中一个非常实用的特性,它允许方法接受数量可变的参数。这个特性在Java 5中被引入,极大地提高了代码的灵活性和可读性。下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ##...

    java反射获取参数.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java 8中,反射机制得到了进一步的增强,使其在处理对象、方法和类时更加灵活。这个“java反射...

Global site tag (gtag.js) - Google Analytics