我正在尝试使用JavaFX和Scala实现一个带有一些思维导图功能的简单笔记组织器。
我正在尝试决定是否应该直接从Scala或通过ScalaFX调用JavaFX代码?我不知道是否值得学习ScalaFX,从Scala代码直接调用JavaFX会不会更简单?
official ScalaFX site提到了ScalaFX的4个好处:
1)自然语言绑定表达
- 这很好,但我并没有真正计划使用那么多的绑定(我打算使用EventBus进行inter-gui-component事件和一些用于gui-component内部事件的绑定)。
2)量身定制的动画语法
- 我不打算在我的项目中使用动画。
3)完全类型安全的API
这似乎是一个微不足道的点......类型安全是一种东西 Java开发人员一直拥有(并且经常认为是理所当然的),和 其他脚本语言的开发人员没有(并且在不知情的情况下) 结果导致运行时错误)。但是,这是至关重要的 功能,如果您正在开发无法意外的应用程序 部署后的运行时错误和错误。
一个好的编译器将能够解决许多常见的编码错误 通过比较预期和实际类型,以及一个伟大的编译器 (像Scala一样)会自动为你推断类型,所以你没有 在整个代码中一再重复它们。
ScalaFX使用类似脚本的DSL语法获得两全其美 您可以很少使用强大的显式类型对象 scala编译器的类型安全性,它将推断并检查类型 每个表达式和API调用。这意味着减少调试时间 奇怪的代码错误和拼写错误,以及更高质量的代码 门!
- 这看起来很有趣! 但我的问题是:我怀疑直接调用JavaFX 来自Scala给我提供与通过ScalaFX调用JavaFX相同的类型安全保证,是不是?我不知道。
4)无缝JavaFX / ScalaFX互操作性:
- 如果我直接从Scala调用JavaFX,那么与通过ScalaFX调用JavaFX相比,我不必担心互操作性问题。
总结:
似乎第3点是唯一可能给我一些好处的 我在简单的项目中关心但是我不知道他们真正在谈论什么类型的安全性?
为什么通过ScalaFX调用JavaFX比直接从Scala调用类型安全更好? 如果我们使用ScalaFX而不是Scala的直接访问,我们会获得什么样的额外类型安全优势?我问这个是因为我无法想象ScalaFX可以提供什么样的附加类型安全性?
所以,换句话说,我知道ScalaFX对于绑定来说是一个很好的语法糖,但它提供更多吗?如果我可以在没有(非常好的)合成糖的情况下生活,我真的应该使用它吗?
除了糖之外还有什么东西可以使用这个包装层(ScalaFX),这会引入额外的复杂性(以及错误的来源)吗?
请注意,我非常感谢ScalaFX创作者的工作!我只是要求这些问题能够做出更明智的决定。
答案 0 :(得分:10)
ScalaFX是一个 DSL ,用于处理JavaFX。提供,你所谓的"句法糖"是DSL的主要目的。
(DSL传统上也将主机语言的范围限制在目标域,但通常不希望Scala DSL。)
现在,它是如何以及何时有用的,本身就是一场辩论,但它提供的是 essentailly all 。 就个人而言,我总是更喜欢一种API,它可以让我更清楚地向我的同事和我未来的自我传达我的意图,但这是每个团队和项目必须自己决定。 ScalaFX的绑定语法很棒,因为Properties和Bindings正在寻找越来越多的后端(即使没有JavaFX GUI)。
我认为ScalaFX广告类型安全的原因是不,因为它是ScalaFX本身的一个特殊功能,但因为值得注意的是使用这样一种类似脚本的语言例如ScalaFX并利用Scala平台的强大功能,仍将为您提供类型安全性(对于新手和不熟悉Scala的人来说,这可能是违反直觉的。)
我会推荐在您的情况下使用ScalaFX ,因为它听起来您正在处理小型项目 ,主要关注通过JavaFx GUI 提供的用户体验(我假设给出了您的描述)。 ScalaFX将允许您在GUI上快速迭代。
在开始时不要担心开销,您的用例几乎不会是性能要求苛刻的应用。如果你确实需要担心性能,为什么要使用Scala;)?
ScalaFX的最大缺点是每个JavaFX类型需要包装并使用SFXDelegate,如果您需要的某些类型未包装,这很麻烦或者将来某些东西会被添加到JavaFX中,你需要等待ScalaFX将其包装起来才能使用它(这两者都不是真正的阻塞者,但首先,包装JavaFX类型是微不足道的(see the ScalaFX Wiki ),其次JavaFX的发布周期比ScalaFX慢很多。
答案 1 :(得分:4)
从纯粹的实践角度来讲,它更加简洁易读。
我建议您通过比较Java和Scla中的代码来亲自看到这一点。 Ther就是两个很好的例子:
代码摘录自 Pro JavaFX 一书,可在本地Java和github上的scalaFX中找到(该页面上有一个指向javafx代码的链接)
此外,您可以将JavaFX-ensemble的代码与ScalaFX-ensemble的代码进行比较。再一次,你会发现它不那么混乱,也更容易阅读。
正如@OJKrylow所指出的,并非所有JavaFX都已被移植,因此它确实存在一些薄弱环节。这在scalafx-ensemble中很明显,并不是所有东西都被移植到scala中。如果您计划构建自己的控件,那么最好用Java编写它们,然后为ScalaFX创建一个包装器对象。
但是如果你正在编写一个小程序,就像你的情况一样,这应该降低理论上的复杂性。但是,缺少标准的介绍性文本意味着你基本上最终会使用上面两个JavaFX资源,并查看它们如何转换为ScalaFX(不幸的是,你无法自己学习它)。我希望将来会有所改变。