vaadin
人们谁是熟悉我的文章,知道我感兴趣的Vaadin(见“走得更远”部分下面的斯卡拉因为两者),也最近可以提高生产力。
环境准备
因此,很自然地,我试图将两者的精华相结合,以此作为一种体验。 作为附加挑战,我还尝试将Maven添加到组合中。 它没有我希望的那么成功,但是结论很有趣(至少对我而言)。
在上一篇文章中 ,我已经展示了如何在Eclipse中创建Scala项目,因此这确实是一件容易的事。 但是,在此基础上将Maven分层比较棘手。 当然将scala库添加到了依赖项列表中,但是我没有找到如何使Maven编译Scala代码,以便每个Eclipse保存都可以进行编译(就像Java一样)。 我找到了Scala Tools提供的maven-scala-plugin 。 但是,我无法使用它对m2eclipse感到满意。 忘记Maven插件了...基本上,我所做的就是创建Maven项目,然后使用m2eclipse从Maven更新Eclipse配置,最后添加Scala构建器:不是很干净而且非常脆弱,因为任何更新都会覆盖Eclipse文件。 如果有人知道“正确”的方法,我将不知所措!
开发时间
现在到问题的核心:我只想要一个文本字段和一个按钮,当按下该按钮时,将显示该字段的内容。 很简单? 并不是的。 我遇到的第一个问题是在Scala中创建按钮单击侦听器的实现。 在Vaadin中,侦听器接口具有单个方法void buttonClick(Button.ClickEvent event)
。 注意到事件的类型吗? 它是Button
的内部类,无法在Scala中导入! 任何有解决方案的人都欢迎前来讲述。
面对这一限制,我决定将侦听器和事件类封装在两个标准Java类中,每个标准Java类中一个。 为了脱钩,更不用说简化生活了,我创建了一个父POM项目和两个模块,一个模块用于Java解决方法类,另一个模块用于实际应用程序。
下一个障碍也与Scala相关,并且由于我这一方面的知识不足。 我是一个Java男孩,因此,为了传递Class
实例,我习惯于编写如下内容:
eventRouter.addListenerVisibleClickEvent.class,this,"displayMessage")
Scala似乎对此并不满意,并拒绝编译以前的代码。 该消息是“预期的标识符,但找到了'类别'”。 正确的语法是:
eventRouter.addListener(classOf[VisibleClickEvent],this,"displayMessage")
此外,在开发过程中,我编写了一种Java转换方式:
getWindow().showNotification(button.getCaption()+" "+(String)field.getValue())
我的朋友Scala大声抱怨“对象字符串不是值”,我像这样纠正了代码:
getWindow().showNotification(button.getCaption()+" "+field.getValue().asInstanceOf[String])
精明的读者应该指出,连接字符串使此强制转换变得不必要,我很高兴最后将其删除。
结论
最后,它花费的时间比我用Java完成示例所需的时间还要多。
- 当然,部分时间上的浪费是由于我缺乏Scala知识所致。
- 但是,由于要访问内部类的额外代码,我不确定Java中的代码行数会减少。
- 实际上,我很肯定使用Java而不是Scala可以简化该项目(一个项目而不是父项目和2个模块)。
我问我自己的问题是,如果Scala无法扩展Java内部类-毫无疑问,API应该在这种约束下发展吗? 为了实现简洁的设计,内部类真的是必需的吗?还是仅是一些用得很少的好用的内部类?
在所有情况下,想要在Scala中对Vaadin应用程序进行编码的开发人员都应在投入使用之前格外小心,并准备降低生产率,使其低于Java,因为Vaadin组件类中有许多内部类。
您可以在这里以Maven / Eclipse格式找到本文的资源。
更进一步:
vaadin