适用于Scala和Java的Builder库 [英] Builder Library for Scala and Java

查看:128
本文介绍了适用于Scala和Java的Builder库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一个可以从Scala和Java调用的构建器库.使用默认的命名参数在Scala中足够容易.但是,如何从Java调用此代码?见下文.还是我应该使用两种语言都更通用的流利API?

I need a builder library that can be called from Scala and Java. Easy enough in Scala using default, named parameters. But how do I call this code from Java? See below. Or perhaps I should go with a fluent API that is more common to both languages?

斯卡拉:

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
    )
  }

用法:

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

Java用法:

Person p1 = ?
Person p2 = ?

推荐答案

默认参数不能在scala和Java之间互操作,如

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

要确定如何使用Java中的上述代码,也许javap可以提供帮助.让我们举一个比您发布的内容更小的例子.例如

to determine how to use your above code from java, perhaps javap can help. let's take a smaller example than what you have posted. for instance

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

使用scalac进行编译,然后在生成的类文件(不带.class扩展名)上运行javap,我们得到

compiling this using scalac, and then running javap on the produced class file (without the .class extension), we get

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);

因此,在您的情况下,您的Java代码应类似于

so in your case, your java code would look something like

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

假设GenderBob类的构造函数中没有任何参数.至于Java的流畅程度,我想最终还是要看味道,但以我的拙见,我认为Java版本对于构建者来说可能不太冗长

assuming the GenderBob class takes no parameters in its constructor. 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

这篇关于适用于Scala和Java的Builder库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆