在Scala中编写Java库的最佳实践

5
我计划编写一个主要供Java使用的库,但我想用Scala编写。我已经阅读了大部分关于Java / Scala互操作性的文档,但它们大多集中在使用现有库上,而不是确保无缝互操作性的最佳实践,当编写库时。
有哪些有效的方法?理想情况下,消费者根本不会知道库是用Scala编写的。
还有其他主要的库这样做吗?
我的当前计划是具有公开所有必需内容的API,带有Scala类型/功能,然后在其上方有一个较小的层将其转换为Java类型。这种方法有什么问题吗?
2个回答

5

您想这样做有什么原因吗?编写一个可以从Scala使用的库是一回事,但如果要专门针对Java进行目标定位,最好使用Java来编写库。

理想情况下,消费者压根不知道库是用Scala编写的。

这样做最大的问题将是瞬时依赖。即使您在您的库中不使用第三方库,Scala标准库怎么办?如果您的库将在未使用Scala的项目中使用,则它们还需要拉取整个Scala库,除非您在代码中根本不使用标准库。

您将要使用Java集合而不是Scala集合,因为客户端代码会期望如此。您的公共接口中不应包含任何Scala标准库类。这也意味着要使用Java函数接口而不是Scala函数类型。

请避免使用伴生对象,除了它们能够编译成类的静态成员的情况下。从Java中访问Scala伴生对象很麻烦。

请使用Java Bean规则来设置getter/setter/案例类,而不是常规的Scala属性(我相信Scala有一个注释可以做到这一点)。

至于现有的库,Spark Java API是用Scala编写的,但Spark主要是为Scala构建的,并具有一些Java支持,但也值得看一看(特别是要了解Scala和Java api之间的差异)。


1
我认为这有合理的理由:正如您所提到的,Spark 正是这样做的。对我而言,这起源于需要使用 Akka Streams(在 Scala 中编码更容易),但要支持使用此库的 Java 项目。 - akauppi

0
我发现唯一需要考虑的问题是需要包含Scala运行库,并在构件名称后附加_2.13
通过Maven发布(sbt publishM2),甚至Scala库也会自动传递到下游项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接