作为UI框架开发人员,提供自定义控件外观和行为的方法是我工作的一部分。 在许多情况下,这是通过允许框架用户在控件上注册工厂来完成的。 过去,我会为此创建一个工厂接口,并在框架内提供一个或多个默认实现。
这些事情在JavaFX中的处理方式有所不同,我已经开始为自己的工作而接受它了。 JavaFX使用一个称为javafx.util.Callback的通用接口,只要需要一段代码即可为给定参数(P)生成结果(R)的地方。
该界面如下所示:
public interface Callback<P,R> {public R call(P param);
}
优点
起初,我不喜欢使用此接口,因为我的代码太冗长:我不再拥有不解释的接口名称。 但最后我意识到优势在于缺乏详细性。 优点是:
- 我们最终减少了编写代码。 没有专用接口,没有默认实现。
- 使用API的开发人员不必记住不同的工厂,而是可以专注于要创建的对象以及对他可用的参数。
- 回调接口是功能接口。 我们可以使用Lambda表达式,这使代码更加优雅,并且我们不得不再次编写更少的代码。
案例分析
FlexGanttFX框架包含一个名为Dateline的控件,用于显示(惊奇)日期。 每个日期都显示在其自己的单元格中。 日界线可以显示不同的时间单元(ChronoUnit从java.time,和从SimpleUnit FlexGanttFX)。 工厂方法用于根据所示的时间单位构建单元。
在使用回调方法之前,我遇到以下情况:一个名为DatelineCellFactory的接口,其中只有一个方法createDatelineCell() 。 我提供了两个默认实现,分别称为ChronoUnitDatelineCellFactory和SimpleUnitDatelineCellFactory 。 通过使用回调,我能够删除所有三个接口/类,并且在日期行的外观中找到了以下两行:
dateline.setCellFactory(<span class="skimlinks-unlinked">SimpleUnit.class</span>,unit -> new SimpleUnitDatelineCell());dateline.setCellFactory(<span class="skimlinks-unlinked">ChronoUnit.class</span>,unit -> new ChronoUnitDatelineCell());
两行代码而不是三个文件! 我认为这个例子说明了一切。
翻译自: https://www.javacodegeeks.com/2014/04/javafx-tip-3-use-callback-interface.html