我打算编写一个主要从Java中使用的库。但是,我想在Scala中写这个。我已经阅读了大部分关于Java / Scala互操作的文档,但它主要集中在使用现有的库,而不是在编写库时确保无缝互操作的最佳实践。
有效实现这一目标的方法有哪些?理想情况下,消费者根本不知道图书馆是用Scala编写的。
还有其他主要的图书馆吗?
我目前的计划是使用一个API来公开Scala类型/功能所需的所有内容,然后在此基础上使用一个较小的层来转换为Java类型。这种方法有什么问题吗?
答案 0 :(得分:4)
你有什么理由要这么做吗?编写一个也可以在Scala中使用的Scala库是一回事,但是如果你想专门针对Java,那么使用Java来编写库可能是有意义的。
理想情况下,消费者根本不会知道该库是用Scala编写的。
最大的问题是瞬态依赖。即使您不使用自己的第三方库,Scala标准库也是如此?如果您的库将用于不使用Scala的项目中,那么除非您在代码中根本不使用标准库,否则他们还需要引入整个Scala库。
您将要使用Java集合而不是Scala集合,因为这是您的客户端代码所期望的。您的公共接口中应该没有Scala标准库类。这也意味着使用Java功能接口而不是Scala功能类型
避免使用伴随对象,除非它们编译为类上的静态成员。从Java访问Scala伴随对象非常麻烦。
对getter / setter / case类使用Java Bean约定而不是常规的Scala属性(我相信Scala有一个注释)。
就现有库而言,Spark Java API是用Scala编写的,但Spark是Scala的主要版本,有一些Java支持,但也许值得一看(特别是看看Scala和Java apis之间的区别。
答案 1 :(得分:0)
我发现的唯一问题是需要包括Scala运行时库,并将_2.13
附加到工件名称。
通过Maven(sbt publishM2
)发布,甚至Scala库也自动进入下游项目。