Scala和Java的Builder库
发布时间:2020-12-16 18:35:02 所属栏目:安全 来源:网络整理
导读:我需要一个可以从 Scala和 Java调用的构建器库.使用默认的命名参数在Scala中足够简单.但是如何从Java调用此代码?见下文.或者我应该使用更流行的两种语言更常见的API? 斯卡拉: case class Person(gender:Gender.Value,firstName:String,lastName:String){
我需要一个可以从
Scala和
Java调用的构建器库.使用默认的命名参数在Scala中足够简单.但是如何从Java调用此代码?见下文.或者我应该使用更流行的两种语言更常见的API?
斯卡拉: 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之间不可互操作,如
http://www.scala-lang.org/node/2075的最后一个语句中所述.
要确定如何使用java上面的代码,也许javap可以提供帮助.让我们举一个比你发布的更小的例子.例如 case class PersonBob(a: String = "aa",b: String = null) 使用scalac编译它,然后在生成的类文件(没有.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); } 我们可以看到我们唯一的构造函数是 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(),"Jones") 假设GenderBob类在其构造函数中不带任何参数.至于Java中的流利程度,我想最终这是一个品味问题,但我认为Java版本对于构建者来说可能不那么冗长 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |