用于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()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |