简体   繁体   English

Scala 和 Java 的构建器库

[英]Builder Library for Scala and Java

I need a builder library that can be called from Scala and Java.我需要一个可以从 Scala 和 Java 调用的构建器库。 Easy enough in Scala using default, named parameters.在 Scala 中使用默认的命名参数很容易。 But how do I call this code from Java?但是我如何从 Java 调用这段代码呢? See below.见下文。 Or perhaps I should go with a fluent API that is more common to both languages?或者也许我应该 go 和流利的 API 这两种语言都更常见?

Scala: Scala:

case class Person(gender:Gender.Value, firstName:String, lastName:String){
  def fullName = lastName+", "+firstName
  override def toString = firstName+","+lastName+","+gender
}
case class PersonBob(
  gender:Gender = GenderBob().build,
  firstName:String =  null,
  lastName:String = null) {
  def build = Person(
    gender,
    if(firstName == null) NameBob(if(gender==Gender.Male) engMaleNames 
      else engFemaleNames).build else firstName,
    if(lastName==null) NameBob(engLastNames).build 
      else lastName
    )
  }

Usage:用法:

val p1 = PersonBob().build
val p2 = PersonBob(lastName = "Jones").build

Java Usage: Java 用途:

Person p1 = ?
Person p2 = ?

default arguments are not interoperable between scala and java, as mentioned in the very last statement from http://www.scala-lang.org/node/2075 . default arguments are not interoperable between scala and java, as mentioned in the very last statement from http://www.scala-lang.org/node/2075 .

to determine how to use your above code from java, perhaps javap can help.要确定如何使用 java 中的上述代码,也许 javap 可以提供帮助。 let's take a smaller example than what you have posted.让我们举一个比你发布的更小的例子。 for instance例如

case class PersonBob(a: String = "aa", b: String = null)

compiling this using scalac, and then running javap on the produced class file (without the.class extension), we get使用 scalac 编译它,然后在生成的 class 文件(没有 .class 扩展名)上运行 javap,我们得到

public class PersonBob extends java.lang.Object implements scala.ScalaObject,scala.Product,scala.Serializable {
    public static final java.lang.String apply$default$2();
    public static final java.lang.String apply$default$1();
    public static final java.lang.String init$default$2();
    public static final java.lang.String init$default$1();
    public static final scala.Function1 tupled();
    public static final scala.Function1 curry();
    public static final scala.Function1 curried();
    public scala.collection.Iterator productIterator();
    public scala.collection.Iterator productElements();
    public java.lang.String a();
    public java.lang.String b();
    public PersonBob copy(java.lang.String, java.lang.String);
    public java.lang.String copy$default$2();
    public java.lang.String copy$default$1();
    public int hashCode();
    public java.lang.String toString();
    public boolean equals(java.lang.Object);
    public java.lang.String productPrefix();
    public int productArity();
    public java.lang.Object productElement(int);
    public boolean canEqual(java.lang.Object);
    public PersonBob(java.lang.String, java.lang.String);
}

we can see that the only constructor we have is我们可以看到我们唯一的构造函数是

public PersonBob(java.lang.String, java.lang.String);

so in your case, your java code would look something like所以在你的情况下,你的 java 代码看起来像

Person p1 = new PersonBob(new GenderBob().build(), null, null)
Person p2 = new PersonBob(new GenderBob().build(), null, "Jones")

assuming the GenderBob class takes no parameters in its constructor.假设 GenderBob class 在其构造函数中没有参数。 as for how fluent this in in Java, i suppose ultimately it is a matter of taste, but in my humble opinion i think the Java version could be less verbose for a builder至于在 Java 中的流利程度,我想最终这是一个品味问题,但在我的拙见中,我认为 Java 版本对于构建者来说可能不那么冗长

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM