2011-06-13 55 views
5

我需要一个可以从Scala和Java调用的构建器库。在Scala中使用默认的命名参数足够简单。但是,我如何从Java调用此代码?见下文。或者,我应该使用两种语言更通用的流畅API?适用于Scala和Java的Builder库

斯卡拉:

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 = ? 

回答

3

默认参数不是Scala和Java之间的互操作性,因为从最后的发言中提到http://www.scala-lang.org/node/2075

确定如何使用你的上面的代码从java,也许javap可以帮助。让我们举一个比你发布的更小的例子。例如

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

编译这个使用scalac,然后对所产生的类文件运行javap的(无.class扩展名),我们得到

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

我们可以看到,我们有唯一的构造是

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

所以你的情况,你的java代码将看起来像

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

假设GenderBob类在其构造函数中没有参数。至于在Java中流畅如何,我想最终它是一个味道的问题,但在我的愚见中,我认为Java版本可能不是一个生成器的详细信息

+0

请注意,我已经创建了一个类似但单独的问题关于类型安全的建造者。参见[http://stackoverflow.com/questions/6347083/type-safe-buider-library-for-scala-and-java](http://stackoverflow.com/questions/6347083/type-safe-buider-library - 用于-阶和Java)可 – eptx 2011-06-14 16:50:20