Scala 如何为带有可选字段的case类创建Java友好API

Scala 如何为带有可选字段的case类创建Java友好API,scala,api-design,scala-java-interop,Scala,Api Design,Scala Java Interop,我正在Scala中创建一些case类,用于持久化mongodb数据。客户端应用程序是用Java编写的,通过传入这些案例类的实例来使用my repository 它工作正常,除非我使用可选字段: case class Person (name: String, email: Option[String]) 现在从Java开始,我不想引用Scala的选项,所以我更喜欢重写一个构造函数,该构造函数允许客户端调用 new Person("Jack", "jack@ripper.com"); 对伴生对

我正在Scala中创建一些case类,用于持久化mongodb数据。客户端应用程序是用Java编写的,通过传入这些案例类的实例来使用my repository

它工作正常,除非我使用可选字段:

case class Person (name: String, email: Option[String])
现在从Java开始,我不想引用Scala的选项,所以我更喜欢重写一个构造函数,该构造函数允许客户端调用

new Person("Jack", "jack@ripper.com");

对伴生对象使用工厂方法也可以。我正在寻找一种解决方案,它允许我在不使用任何scala deps的情况下编写Java,最好不要比调用构造函数更复杂。思考?

为什么这还不够

case class Person (name: String, email: Option[String]) {
    def this(name: String, email: String) {
        this(name, Option(email))
    }
}

当然,它仍然使用
选项[String]
,但对客户端来说仍然是不可见的。唯一的问题是Java客户端代码仍然可以看到这两个构造函数。

更好的是,您可以将默认构造函数设置为私有[packagename]构造函数,然后客户端只能看到另一个构造函数(假设您没有Scala客户端)。我很幸运地摆脱了对Java的需求,所以我不记得为什么简单的构造函数不够好。我从那里开始,出于某种原因放弃了那条路。如果有问题的话,我会再从这里开始。啊,我刚刚解决了这个问题:salat(我用于MongoDB集成的框架)不喜欢多个构造函数,如果有它们的话,它将无法进行转换。java调用方如何指示缺少的电子邮件?另一个构造函数或(抖动)null?