第二次尝试使用Vaadin和Scala

我上周的文章使我感到有些沮丧:当我无法从Scala的Java内部类继承时,试图缓解Vaadin开发的努力遭到了残酷的停止。 我想知道这是不可能还是仅仅缺乏知识。

幸运的是, Robert Lally和Dale在他们的评论中给了我解决方案(非常感谢他们)。 用于在Scala中从Java访问内部类的运算符是#。 简单,但难以谷歌搜索...这产生了一个重要的结果:我不必创建Java包装器类,并且我可以有一个简单的Maven项目!

事后提醒,我的开发进行得更好。 我尝试使用以下Scala功能。

简明

与上周比较,我的侦听器不使用任何Java解决方法,而变成:

@SerialVersionUID(1L)
classSimpleRouterClickListener(eventRouter:EventRouter)extendsClickListener{
 defbuttonClick(event:Button#ClickEvent)=eventRouter.fireEvent(event)
}

现在,我可以欣赏到Scala的冗长程度。 这一点在三点中显而易见:

  • @SerialVersionUID :比同名字段好10倍
  • 没有括号! 与以前的Java版本一样可读的一行代码,尽管我必须习惯
  • 类声明中的简洁性,因为构造函数和getter都是隐式的

特征

CustomComponent不实现观察者模式。 由于它不是唯一的,所以拥有这样一个可重用的功能(换句话说,就是Scala特性)会很好。 让我们这样做:

traitRouter{
  valeventRouter:EventRouter=newEventRouter()
}
自我注意下次,我会记得Java中的Class <?>在Scala中写为Class [_]。 我从一开始就拥有括号,但下划线输了10分钟...

现在,我只需要声明一个混合了trait和presto的组件类,我的组件就可以访问事件路由器对象。

后期绑定

可以访问事件路由器对象是一件很不错的事,但并不是一件革命性的事情。 实际上,特征暴露了它,从而破坏了封装和松散耦合。 如果我的路由器特征可以直接使用侦听器,那肯定会更好。 让我们将此方法添加到特征中:

defaddListener(clazz:Class[_],method:String)=eventRouter.addListener(clazz,this,method)

我真的不知道,如果它的正确使用后期绑定,长期在这种情况下,但它看起来像它,因为this的特质引用不信邪,将在稍后绑定到具体类混合的特质。

下一站

现在,我已经意识到ClickListener接口只是单个函数的一个薄包装:这是实现闭包的Java方法。 那么,为什么要完全实现此接口?

为什么我不能写这样的val f(event:Button#ClickEvent) = (eventRouter.fireEvent(_))并将其传递给按钮的addListener()方法? 因为它没有实现正确的接口。 因此,我问自己,Scala的一流函数和单一方法接口之间是否存在桥梁。

结论

这个星期我在Scala / Vaadin实验中走的更远。 越来越好了。 到目前为止,使用Scala开发Vaadin应用程序没有任何问题。 当我有更多时间时,我将尝试一个简单的应用程序以发现其他问题(如果存在)。

您可以在此处以Maven / Eclipse格式找到本文的来源。

翻译自: https://blog.frankel.ch/second-try-with-vaadin-and-scala/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值