- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近一直在看java的相关东西,因为我们在ios开发是,无论是objective-c还是swift中,经常会用到委托代理回调,以及block回调或者说是闭包回调。接下来我们就来看看java语言中是如何实现委托代理回调以及闭包回调的。当然这两个技术点虽然实现起来并不困难,但是,这回调在封装一些公用组件时还是特别有用的。所以今天,还是有必要把java中的委托代理回调以及闭包回调来单独的拿出来聊一下.
本篇博客我们依然依托于实例,先聊聊委托代理回调的实现和使用场景,然后再聊一下使用匿名内部类来进行回调,其实就是我们常说的“闭包”回调。闭包回调的实现方式其实就是匿名内部类的使用。既然本篇博客我们使用到了匿名内部类,我们就再聊一下java中的内部类的相关东西.
1、委托代理回调 。
在ios开发中,我们经常使用到委托代理回调,想tableview、collectionview等等,这些高级控件会依赖于委托回调来完成一些配置。当然在java中委托代理回调也是非常有用的,接下来我们就来看一下java中的委托代理回调。当然在swift或者oc中的委托代理回调是依托于“协议”的,swift或者oc中的“协议”其实就是java语言中的“接口”。所以在java中的委托代理回调,依然要依托于“接口”来实现.
1、类图 。
首先我们给出该部分实例的类图,然后我们根据下方的类图来设计实现我们的具体代码。下方就是本部分所设计demo的类图,当然,从类图中我们也能直观的看到,该示例是比较简单的,一共也就是一个接口两个类。customdelegate这个接口是代理类要实现的接口,其中包含了代理类要实现的方法.
从下方的类图中我们可以看出,代理类firstclass实现了customdelegate代理接口,并实现了相关的代理方法。而secondclass依赖于customdelegate接口,也就是说只要是实现了customdelegate接口的类都可以作为secondclass的代理。而firstclass中含有secondclass类型的属性,并且firstclass又实现了customdelegate接口,在firstclass中,我们将secondclass对象的代理类指定为firstclass,稍后我们在具体实现时将会介绍到.
2、代码的具体实现 。
根据上述类图,我们很容易的就可以给出相应的代码实现。接下来我们就根据上述类图来给出具体的代码实现.
(1)、customdelegate的代码实现 。
下方代码段就是customdelegate的具体实现。当然该接口的实现比较简单,就一个setvalue(string value)方法。该方法的具体作用是用来相应参数回调的。下方我们会用到该方法.
1
2
3
4
5
|
package
com.zeluli.callback.delegate;
public
interface
customdelegate {
public
void
setvalue(string value);
}
|
(2)、secondclass的代码实现 。
customdelegate实现完毕后,接下来我们就来实现一下secondclass的具体代码。下方代码段就是secondclass的具体代码实现了。我们从具体实现中可以明确看出,secondclass类中有个私有的delegate属性,该属性是customdelegate类型的,所以secondclass依赖于customdelegate类型.
在secondclass的构造方法中,我们为delegate指定了具体的对象,然后调用了begin()方法。begin()方法中做的事情也是比较简单的,就是使用了java中自带的定时器,然后在特定时间的间隔中执行delegate对象的setvalue()方法,并且将当前的时间传给setvalue()方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package
com.zeluli.callback.delegate;
import
java.text.simpledateformat;
import
java.util.date;
import
java.util.timer;
import
java.util.timertask;
public
class
secondclass {
private
customdelegate delegate;
public
secondclass(customdelegate delegate) {
this
.delegate = delegate;
this
.begin();
}
public
void
begin() {
timertask task =
new
timertask() {
@override
public
void
run() {
delegate.setvalue(getnowdate());
//执行委托代理回调方法
}
};
long
delay =
0
;
timer timer =
new
timer();
timer.scheduleatfixedrate(task, delay,
1000
);
}
private
string getnowdate() {
date currenttime =
new
date();
simpledateformat formatter =
new
simpledateformat(
"yyyy-mm-dd hh:mm:ss"
);
string datestring = formatter.format(currenttime);
return
datestring;
}
}
|
(3)、firstclass的创建 。
接下来我们来创建委托代理类,也就是我们的firstclass类。其中的代码也是比较简单的,firstclass类实现了customdelegate的相关方法,然后为secondclass对象指定了代理对象就是当前类的对象。具体代码如下所示.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package
com.zeluli.callback.delegate;
public
class
firstclass
implements
customdelegate {
private
secondclass secondclass;
public
void
beginrunseconddelegatemethod() {
if
(
this
.secondclass ==
null
) {
this
.secondclass =
new
secondclass(
this
);
}
}
//secondclass回调要执行的方法
@override
public
void
setvalue(string value) {
system.out.println(
"第二个类回调过来的值:"
+ value);
}
}
|
3、测试用例和运行结果 。
接下来我们来看一下上述代码的测试用例和运行结果。下方代码段就是我们的测试用例,代码比较简单,就是实例化了一个firstclass的类对象firstobj,然后调用相应的方法为其中的secondclass指定代理方法即可,具体如下所示.
1
2
3
4
5
6
7
8
|
package
com.zeluli.callback.delegate;
public
class
main {
public
static
void
main(string[] args)
throws
interruptedexception {
firstclass firstobj =
new
firstclass();
firstobj.beginrunseconddelegatemethod();
}
}
|
下方就是上述代码的运行结果,我们可以看出定期会执行firstclass中的setvalue()方法.
2、闭包回调 。
上面我们实现了委托代理回调,接下来我们来对上述示例进行改造。将其改成匿名内部类的实现方式,也就是使用闭包的形式来实现回调。我们只需要讲firstclass进行修改即可。将其委托代理回调修改成闭包回调的形式。下方代码段就是我们修改后的firstclass类的源代码.
从下方的源代码可以看出,firstclass并没有实现customdelegate接口。在为secondclass的对象指定委托代理对象时,我们传入的是一个匿名内部类的对象,而这个对象的类型是customdelegate。这种用法,也是匿名内部类的使用方式之一.
修改后的代码的测试用例以及运行结果与之前第一部分的委托代理回调的方式一致,在此就不做过多赘述了.
3、内部类 。
既然,上述我们使用到了匿名内部类,那么接下来的这部分我们就来看看内部类的相关内容。内部类,顾名思义,就是定义在接口、类、方法等结构的内部的类。而匿名内部类,就是没有名字的内部类,这一点也是比较好理解的。下方我们分别从迭代器的示例以及工厂模式的示例中来窥探一下内部类的具体使用场景及使用规则。当然这两个示例所针对的内部类的角度不同.
1、迭代器中的内部类 。
在之前的文章中,我们详细的聊了迭代器模式,当然之前的迭代器我们是使用的swift3.0来实现的,今天我们就用java的内部类来实现一个java中的迭代器.
(1)、迭代器接口 。
按照之前的介绍迭代器的套路,我们还是先要创建迭代器接口的。下方的selector就是我们创建的迭代器接口.
end()方法用来判断序列是否到达了结尾处.
current()方法则用来获取当前序列中下标的值.
next()方法则是移动下标到下一个位置.
为了统一迭代器使用规范性,所有的迭代器都要遵循该接口。具体代码如下所示.
(2)、创建序列类以及迭代器内部类 。
下方创建的就是我们的序列类sequence,该类中的items数组用来存储元素,而next属性指向当前值的下标。在sequence类中,除了属性、构造器以及方法外,我们还在其中定义了一个内部类sequenceselector.
sequenceselector类就是sequence类的迭代器,并且sequenceselector要实现迭代器接口selector。下方我们要注意的一点,在内部类sequenceselector中,可以直接访问外层类sequence类的成员属性和方法。因为无论是内部类还是sequence类的成员属性,都在sequence类的域中.
当然下方的代码的逻辑是比较简单的,主要是对items数组的操作。具体代码如下所示.
(3)、上述迭代器的使用 。
定义完迭代器后,接下来,我们就来看一下迭代器的使用呢。首先我们创建一个序列对象,然后通过for循环往这个序列对象里边添加对象。紧接着我们从这个序列对象中获取其对应的迭代器对象,然后操作迭代器对序列进行遍历。具体操作如下所示.
2、工厂模式中的匿名内部类 。
聊完迭代器的内部类,接下来我们来看一下工厂模式中的匿名内部类。在之前的文章中,我们详细的聊了工厂模式的具体内容。本篇文章我们就来看一下,匿名内部类在工厂模式中的使用.
(1)、类图 。
service接口:首先我们来看一下service接口,该接口是所有具体的实现类要实现的接口。其中定义这具体的方法声明。我们的实现类都要继承自该接口.
servicefactory接口:该接口是所有工厂类要实现的接口,因为本部分我们的工厂类是以匿名内部类的形式来体现的,所有该接口就是我们“匿名内部类”的类型.
implemention1、2类:这两个类就是我们的具体实现类,我们的工厂就负责实例化这两个类.
factories类:该类就负责调用工厂方法来创建相关实例,并执行实例的相关方法.
(2)、service和servicefactory接口的具体实现 。
这两个接口的实现代码比较简单,在此就不做过多赘述了,具体代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.zeluli.innerclass.factory;
public
interface
service {
void
method1();
void
method2();
}
======================================================
package
com.zeluli.innerclass.factory;
public
interface
servicefactory {
service getservice();
}
|
(3)、implementation相关类的实现 。
implementation1和implementation2的实现差不多,我们就聊一下implementation1类的具体代码。从下方代码片段中我们可以看出implementation1类实现了service接口,并且给出了接口中相关方法的实现。并且在implementation1类中有一个servicefactory类型的静态变量factory。而factory引用的是一个servicefactory类型的匿名内部类的对象。该匿名内部类就是一个工程类,其中有一个方法负责创建当前外围类,也就是implementation1类的对象。具体实现如下所示.
(4)、factory类的实现 。
接下来我们就来看看factory类的实现,factory中就负责从工厂中获取相应的对象,然后执行对象的相关方法,代码比较简单,就不做过多赘述了.
(5)、测试用例与运行结果 。
接下来我们来看一下上述实例的测试用例以及输出结果,如下所示:
以上这篇详谈java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)的文章就讲到这里了,如果你想了解更多关于详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
我通过 NSURLConnction 从服务器获取数据,并希望从获取的数组中填充表格 View 。数据出现在 NSURLConnection 委托(delegate)方法的日志中,但我意识到 numb
我已经将我用作标题 View 的 View 子类化,它里面有一些按钮委托(delegate),它工作得很好。 但是,我在 viewController 上方展示了一个 modalViewControl
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
我有一个问题: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInf
伙计们。我正在寻求帮助。这似乎是一个非常简单的任务,但我可以解决一整天。我正在尝试使用容器 View 创建侧面菜单。当用户按下“更多”按钮(barButtonItem)时,整个 View 向右滑动并出
我正在努力将 UIWebView 迁移到 WKWebView。我已经更改了所有委托(delegate)方法。我需要 WKWebView 委托(delegate)方法等于下面的 UIWebView 委托
我正在学习 VB.NET 中的委托(delegate),但对委托(delegate)类型感到困惑。在阅读有关委托(delegate)的内容时,我了解到委托(delegate)是一种数据类型,可以引用具
我有一个用 Objetive-C 构建的框架。该框架用于连接蓝牙设备并与之交互。 在演示代码中,Objetive-C 委托(delegate)函数如下所示。演示代码由框架创建者提供。 -(void)b
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
我正在努力了解 async/await 并认为我确实了解有关用法的一些事情。但仍然不太清楚在下面的场景中实际好处是什么。 查看 Task.Run 用法。第一种方法使用普通委托(delegate)并使用
我已经尝试了在我的网站上使用 openID 委托(delegate)的所有可能选项,但没有一个方法对我有用。 我的 HTML 文件的 head 部分有“link rel”标签。 我在 HTML 文件的
如何快速创建一个委托(delegate),即 NSUserNotificationCenterDelegate? 最佳答案 这里有一些关于两个 View Controller 之间委托(delegat
我有一个带有数据源的 NSComboBox,当您单击三角形并通过单击它选择其中一个项目时,它可以完美运行。但是,我还希望它允许用户在框中键入以使用自动完成来选择名称。目前,当用户键入时,我希望选择的项
我在代码中定义了以下类和委托(delegate)(为简洁起见,剪掉了许多其他行)。 Public Delegate Sub TimerCallback(canceled As Boolean) Pub
我使用 ansible 2.1 并且我想使用 delegate_to 向一组主机运行命令。我使用 localhost 作为主机参数,并且我想将“touch”命令委托(delegate)给两个 cls
我想通过重载为我的类实现几个构造函数。据我了解,遵循 DRY 原则的惯用方式是使用一种称为委托(delegate)构造函数的功能。我也看到了关于在任何地方使用引用参数并不惜一切代价避免使用指针的想法,
代表们会导致内存泄漏吗? 我的意思是,例如如果一个类A包含一个ADelegate,并且后者指向BMethod(属于B类),这可以防止GC收集A类或B类吗? 如果是这样,我们如何“释放”代表(设置ADe
委托(delegate)命令和路由命令有什么区别? 我读了一些文章说在 MVVM 上使用委托(delegate)命令而不是路由命令。 那么当我们使用 MVVM 时,Delegate Command 相
我是一名优秀的程序员,十分优秀!