gpt4 book ai didi

java - Scala 和 Java 的类型安全构建器库

转载 作者:搜寻专家 更新时间:2023-11-01 01:38:07 24 4
gpt4 key购买 nike

下面是 Scala 中类型安全、流畅的构建器模式,如 http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints 所述。 .它类似于 Builder Library for Scala and Java ,但专门处理编译时构建器检查。这怎么能从Java调用?在给定“scala.Predef$$eq$colon$eq”参数的情况下,可以使用 Scala AND Java 的干净 API 来完成吗?

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

build 方法必须检查是否分配了每个属性,因此当您泛化到多个属性时它会变得非常嘈杂:

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(),
Builder$.MODULE$.assigned(),
//...
);

借助辅助类中的一些静态委托(delegate)(和一些静态导入),您应该能够将其简化为:

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

关于java - Scala 和 Java 的类型安全构建器库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6347083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com