在现实开发中,有很多种情况及遇到情况后出现的一些奇思妙想。
比如在javaScript中,我们是可以在函数中传递函数,然后在函数中启用这个传递过来的函数方法。而在java中,方法传递方法这一种说法貌似并不怎么现实。
不过这种方法还是有的,在之前,我百度过很多这样的情况,但是并没有得到恰当的解决。
网上的回答各式各样,答非所问的也有,奇葩的答案及模棱两可的也有。但是给出的答案并没有从根本去解决我的需求,经过百度推送中那日志处理类的思路,我想到了一个最为恰当的方法,在此分享给各位:
百度上有些人的思路也差不多,不过过于麻烦,且有些最为奇葩的为传递字符串去用映射去创建该方法,这是最不可行的。
在开发中最注重的是思路清晰,有一个清晰的思路才能做好优秀完美的程序。
进入主题,Java方法如何作为参数传递:
这一点会让很多人进入一个思维的误区,那就是通过映射。这是一个打错特错的方法。如果通过映射去做,影响性能不说,还有很长的代码量。
所以我通过的还是接口实现
首先我们创建一个接口,在接口中不需要写过多的东西,仅仅就写一个方法,不用去刻意实现。
然后我们就可以通过这一个方法就好了
demo如下:
首先创建一个接口
/** * explain: inject one method * translate: 注入一个方法 * @author Muci 伤寒 * Copyright (C), ORG伤寒 * qq:1877378299 * mail:admin@baozoubook.com * tel:18616220047 */ public interface InjectMethod { /** * explain: 注入的方法 * translate: 方法 */ public void inMethod(); }
然后我们在需要传递方法的方法上设定一个参数为 InjectMethod 版权所有:伤寒 联系电话:18616220047 联系邮箱:1877378299@qq.com 联系QQ:1877378299 联系QQ群:248148860 转载请注明出处: http://user.qzone.qq.com/1877378299/2 或 http://www.yoodb.com
这一种模式设定十分有意义,比如做公共方法,在方法中需要调用者去写某一特定的方法时,可用
如以下Demo 我创建一个线程监听者对象 在这个线程中,我不去设定这些线程执行什么方法,如何去执行
仅仅调用者去创建及实现。案例如下/**
* explain: Thread Listening
* translate: 线程监听者
* @author Muci 伤寒
* Copyright (C), ORG伤寒
* qq:1877378299
* mail:admin@baozoubook.com
* tel:18616220047
*/
public class ThreadListening implements Runnable {
private InjectMethod method;
public ThreadListening(InjectMethod method) {
this.method = method;
}
@Override
public void run() {
method.inMethod();
}
}
就这么简单,调用者在创建这个类的时候就需要将这一个InjectMethod中的inMethod方法进行重写,重写这一个方法之后即可在启动这个线程类的时候去执行调用者设定的方法了
启动线程的Demo如下:public class StartSocketServer {
public static void main(String[] args) {
ThreadListening threadListening1 = new ThreadListening(new InjectMethod() {
@Override
public void inMethod() {
int i = 0;
while(true){
System.out.println("一号线程:"+(i+=1));
if(i==1000){
return;
}
}
}
});
ThreadListening threadListening2 = new ThreadListening(new InjectMethod() {
@Override
public void inMethod() {
int i = 0;
while(true){
System.out.println("二号线程:"+(i+=1));
if(i==200){
return;
}
}
}
});
Thread thread = new Thread(threadListening1);
thread.start();
Thread thread2 = new Thread(threadListening2);
thread2.start();
}