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

用于Scala和Java的类型安全的Builder库

发布时间:2020-12-16 09:52:27 所属栏目:安全 来源:网络整理
导读:下面是 Scala中一个类型安全,流畅的构建器模式,如 http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints所述.它与 Builder Library for Scala and Java类似,但特别涉及编译时构建器检查.这怎么能从Java调用?可以使用干净的Scal
下面是 Scala中一个类型安全,流畅的构建器模式,如 http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints所述.它与 Builder Library for Scala and Java类似,但特别涉及编译时构建器检查.这怎么能从Java调用?可以使用干净的Scala和Java API来实现“scala.Predef $$eq $colon $eq”参数吗?

sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean

class Builder[HasProperty <: TBoolean] private(i: Int) {
  protected def this() = this(-1)
  def withProperty(i: Int)(implicit ev: HasProperty =:= TFalse) = new Builder[TTrue](i)
  def build(implicit ev: HasProperty =:= TTrue) = println(i)
}

//javap output
    public class Builder extends java.lang.Object implements scala.ScalaObject{
    public Builder withProperty(int,scala.Predef$$eq$colon$eq); //How is this called from Java?
    public void build(scala.Predef$$eq$colon$eq);
    public Builder();
}
object Builder {
  def apply() = new Builder[TFalse]
}

解决方法

您应该能够使用Java中的这个API,与Scala版本相比会产生一些额外的噪音.一些便利领域会让事情变得安静:

object Builder {
   def apply() = new Builder[TFalse]
   val unassigned = =:=.tpEquals[TFalse]
   val assigned = =:=.tpEquals[TTrue] 
}

Java客户端代码应该看起来像

Builder$.MODULE$.apply()
   .withProperty(10,Builder$.MODULE$.unassigned())
   .build(Builder$.MODULE$.assigned());

构建方法必须检查是否已分配每个属性,因此在推广到多个属性时会产生相当大的噪音:

Builder$.MODULE$.apply()
   .withProp1(10,Builder$.MODULE$.unassigned())
   .withProp2(20,Builder$.MODULE$.unassigned())
   .withProp3(30,Builder$.MODULE$.unassigned())
   // ...
   .build(Builder$.MODULE$.assigned(),Builder$.MODULE$.assigned(),//...
         );

对于辅助类中的一些静态委托(以及一些静态导入),您应该能够将其归结为:

createBuilder()
   .withProp1(10,unassigned())
   .withProp2(20,unassigned())
   .build(assigned(),assigned());

(编辑:李大同)

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

    推荐文章
      热点阅读