加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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版本对于构建者来说可能不那么冗长

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读