在Kotlin中实施访客模式的最佳方法

最大限度

在Kotlin中是否有任何技巧或通用方法来实现访客模式对于初学者来说可能不是很明显的任何事情,但是会导致代码更简洁或更有组织。

编辑以澄清:我有一个AST,其中有许多(〜30)种类型的节点。当前,每个类都实现自己的print()方法,我想将其分解为单独的Printer类。有了访问者模式,添加其他AST遍历类将变得更加干净,其中将有几个。

杰森·米纳德(Jayson Minard)

阅读Java 8的答案,它所说的一切也适用于Kotlin:

对Java语言的添加并没有使每个旧概念过时。实际上,Visitor模式非常擅长支持添加新操作。

Kotlin确实如此。与Java 8一样,它具有LambdaSAM转换允许默认实现的接口

一种更改是,如果您要进行类实例类型检查,请使用Kotlin中表达式,而不是if对每次instanceof检查使用语句when

在同一Stackoverflow页面上,使用不同的答案讨论了正在使用的Lambda,并显示if了Java语句来确定要调用的Lambda。代替他们的Java示例

if (animal instanceof Cat) {
    catAction.accept((Cat) animal);
} else if (animal instanceof Dog) {
    dogAction.accept((Dog) animal);
} else if (animal instanceof Fish) {
    fishAction.accept((Fish) animal);
} else if (animal instanceof Bird) {
    birdAction.accept((Bird) animal);
} else {
    throw new AssertionError(animal.getClass());
}

使用此Kotlin:

when (animal) {
    is Cat -> catAction.accept(animal)
    is Dog -> dogAction.accept(animal)
    is Fish -> fishAction.accept(animal)
    is Bird -> birdAction.accept(animal)
    else -> throw AssertionError(animal.javaClass)
}

在Kotlin中,您不需要进行强制转换,因为当编译器看到实例类型检查时,会自动进行智能强制转换is

此外,在科特林可以使用密封类代表层次中的可能选项,然后编译器可以判断,如果你已经用尽了所有的情况下,这意味着你不需要elsewhen声明。

否则,该页面上的正确内容以及对同一问题的其他常见答案是对Kotlin的有益信息。我认为在Java 8,Scala或Kotlin中看到实际的文字访问者模式并不常见,而是使用lambda和/或模式匹配的变体。

其他相关文章:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

跟踪访客来源的最佳方法是?

来自分类Dev

使用带有返回值的访客模式实现AST的最佳方法是什么?

来自分类Dev

访客实施:固定访客与可变访客

来自分类Dev

在Laravel / Vue SPA中实施Service Worker的最佳方法

来自分类Dev

在Lisp中实施车队移动和可能移动的最佳方法

来自分类Dev

在SQL Server中实施审核跟踪的最佳方法?

来自分类Dev

实施Codeigniter登录的最佳方法

来自分类Dev

实施Codeigniter登录的最佳方法

来自分类Dev

Java 8默认方法的访客模式

来自分类Dev

在iOS应用中实施MVC模式的正确方法是什么?

来自分类Dev

在 Kotlin 中嵌套枚举的最佳方法?

来自分类Dev

如何在Kotlin / Arrow.kt中为生产者频道实施“铁路模式”

来自分类Dev

在Meteor中实施全局搜索(在多个集合中搜索)的最佳方法是什么

来自分类Dev

实施Map Reduce的最佳编程方法

来自分类Dev

为TSP实施地图的最佳方法

来自分类Dev

使用Firebase实施推送通知的最佳方法

来自分类Dev

实施异地备份php / mysql的最佳方法

来自分类Dev

实施控制的最佳方法是什么

来自分类Dev

此访客实施是否正确?

来自分类Dev

此访客实施是否正确?

来自分类Dev

在棒棒糖成型设备中实施材料设计的最佳方法是什么?

来自分类Dev

解释器的访客模式-基于实例类型的调用方法

来自分类Dev

在Restkit中纠缠路径模式的最佳方法是什么

来自分类Dev

在Restkit中纠缠路径模式的最佳方法是什么

来自分类Dev

在JavaScript中实现模块模式功能的最佳方法?

来自分类Dev

什么是摆脱多个php文件中的模式的最佳方法?

来自分类Dev

如何在Chrome中禁用访客浏览模式?

来自分类Dev

在C ++中实现访客设计模式时出错

来自分类Dev

访客模式:重载与重载

Related 相关文章

  1. 1

    跟踪访客来源的最佳方法是?

  2. 2

    使用带有返回值的访客模式实现AST的最佳方法是什么?

  3. 3

    访客实施:固定访客与可变访客

  4. 4

    在Laravel / Vue SPA中实施Service Worker的最佳方法

  5. 5

    在Lisp中实施车队移动和可能移动的最佳方法

  6. 6

    在SQL Server中实施审核跟踪的最佳方法?

  7. 7

    实施Codeigniter登录的最佳方法

  8. 8

    实施Codeigniter登录的最佳方法

  9. 9

    Java 8默认方法的访客模式

  10. 10

    在iOS应用中实施MVC模式的正确方法是什么?

  11. 11

    在 Kotlin 中嵌套枚举的最佳方法?

  12. 12

    如何在Kotlin / Arrow.kt中为生产者频道实施“铁路模式”

  13. 13

    在Meteor中实施全局搜索(在多个集合中搜索)的最佳方法是什么

  14. 14

    实施Map Reduce的最佳编程方法

  15. 15

    为TSP实施地图的最佳方法

  16. 16

    使用Firebase实施推送通知的最佳方法

  17. 17

    实施异地备份php / mysql的最佳方法

  18. 18

    实施控制的最佳方法是什么

  19. 19

    此访客实施是否正确?

  20. 20

    此访客实施是否正确?

  21. 21

    在棒棒糖成型设备中实施材料设计的最佳方法是什么?

  22. 22

    解释器的访客模式-基于实例类型的调用方法

  23. 23

    在Restkit中纠缠路径模式的最佳方法是什么

  24. 24

    在Restkit中纠缠路径模式的最佳方法是什么

  25. 25

    在JavaScript中实现模块模式功能的最佳方法?

  26. 26

    什么是摆脱多个php文件中的模式的最佳方法?

  27. 27

    如何在Chrome中禁用访客浏览模式?

  28. 28

    在C ++中实现访客设计模式时出错

  29. 29

    访客模式:重载与重载

热门标签

归档