var oneValue
: Option
[String
] = None
var twoValue
: Option
[Int
] = None
def one
(value
: String
): SimpleBuilder
= { oneValue = Some(value)
}
def two
(value
: Int
): SimpleBuilder
= { twoValue = Some(value)
}
Simple(oneValue.getOrElse("DEFAULT"), twoValue.getOrElse(0))
}
}
case class Complex
(part
: Double, place
: String
)
var partValue
: Option
[Double
] = None
var placeValue
: Option
[String
] = None
def part
(value
: Double
): ComplexBuilder
= { partValue = Some(value)
}
def place
(value
: String
): ComplexBuilder
= { placeValue = Some(value)
}
Complex(partValue.getOrElse(0.0), placeValue.getOrElse("DEFAULT"))
}
}
class BuilderFactory
[T, B
: ClassTag
] { def create
: B
= classTag
[B
].
runtimeClass.
newInstance().
asInstanceOf[B
] }
def builder
[T, B
](typ
: T
)(implicit ev
: BuilderFactory
[T, B
]): B
= ev.
create }
implicit val simpleFactory
= new BuilderFactory
[Class
[Simple
], SimpleBuilder
] implicit val complexFactory
= new BuilderFactory
[Class
[Complex
], ComplexBuilder
]
println(builder(classOf[Simple]).one("SOMETEXT").two(22).build())
println(builder(classOf[Complex]).part(3.14).place("London").build())
}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewoKaW1wb3J0IHNjYWxhLnJlZmxlY3QuXwoKY2FzZSBjbGFzcyBTaW1wbGUob25lOiBTdHJpbmcsIHR3bzogSW50KQoKY2xhc3MgU2ltcGxlQnVpbGRlciB7CiAgdmFyIG9uZVZhbHVlOiBPcHRpb25bU3RyaW5nXSA9IE5vbmUKICB2YXIgdHdvVmFsdWU6IE9wdGlvbltJbnRdID0gTm9uZQoKICBkZWYgb25lKHZhbHVlOiBTdHJpbmcpOiBTaW1wbGVCdWlsZGVyID0gewogICAgb25lVmFsdWUgPSBTb21lKHZhbHVlKQogICAgdGhpcwogIH0KCiAgZGVmIHR3byh2YWx1ZTogSW50KTogU2ltcGxlQnVpbGRlciA9IHsKICAgIHR3b1ZhbHVlID0gU29tZSh2YWx1ZSkKICAgIHRoaXMKICB9CgogIGRlZiBidWlsZCgpOiBTaW1wbGUgPSB7CiAgICBTaW1wbGUob25lVmFsdWUuZ2V0T3JFbHNlKCJERUZBVUxUIiksIHR3b1ZhbHVlLmdldE9yRWxzZSgwKSkKICB9Cn0KCmNhc2UgY2xhc3MgQ29tcGxleChwYXJ0OiBEb3VibGUsIHBsYWNlOiBTdHJpbmcpCgpjbGFzcyBDb21wbGV4QnVpbGRlciB7CiAgdmFyIHBhcnRWYWx1ZTogT3B0aW9uW0RvdWJsZV0gPSBOb25lCiAgdmFyIHBsYWNlVmFsdWU6IE9wdGlvbltTdHJpbmddID0gTm9uZQoKICBkZWYgcGFydCh2YWx1ZTogRG91YmxlKTogQ29tcGxleEJ1aWxkZXIgPSB7CiAgICBwYXJ0VmFsdWUgPSBTb21lKHZhbHVlKQogICAgdGhpcwogIH0KCiAgZGVmIHBsYWNlKHZhbHVlOiBTdHJpbmcpOiBDb21wbGV4QnVpbGRlciA9IHsKICAgIHBsYWNlVmFsdWUgPSBTb21lKHZhbHVlKQogICAgdGhpcwogIH0KCiAgZGVmIGJ1aWxkKCk6IENvbXBsZXggPSB7CiAgICBDb21wbGV4KHBhcnRWYWx1ZS5nZXRPckVsc2UoMC4wKSwgcGxhY2VWYWx1ZS5nZXRPckVsc2UoIkRFRkFVTFQiKSkKICB9Cn0KCmNsYXNzIEJ1aWxkZXJGYWN0b3J5W1QsIEI6IENsYXNzVGFnXSB7CiAgZGVmIGNyZWF0ZTogQiA9IGNsYXNzVGFnW0JdLnJ1bnRpbWVDbGFzcy5uZXdJbnN0YW5jZSgpLmFzSW5zdGFuY2VPZltCXQp9CgpvYmplY3QgRml4dHVyZUJ1aWxkZXIgewogIGRlZiBidWlsZGVyW1QsIEJdKHR5cDogVCkoaW1wbGljaXQgZXY6IEJ1aWxkZXJGYWN0b3J5W1QsIEJdKTogQiA9IGV2LmNyZWF0ZQp9CgppbXBvcnQgRml4dHVyZUJ1aWxkZXIuXwppbXBsaWNpdCB2YWwgc2ltcGxlRmFjdG9yeSA9IG5ldyBCdWlsZGVyRmFjdG9yeVtDbGFzc1tTaW1wbGVdLCBTaW1wbGVCdWlsZGVyXQppbXBsaWNpdCB2YWwgY29tcGxleEZhY3RvcnkgPSBuZXcgQnVpbGRlckZhY3RvcnlbQ2xhc3NbQ29tcGxleF0sIENvbXBsZXhCdWlsZGVyXQoKcHJpbnRsbihidWlsZGVyKGNsYXNzT2ZbU2ltcGxlXSkub25lKCJTT01FVEVYVCIpLnR3bygyMikuYnVpbGQoKSkKcHJpbnRsbihidWlsZGVyKGNsYXNzT2ZbQ29tcGxleF0pLnBhcnQoMy4xNCkucGxhY2UoIkxvbmRvbiIpLmJ1aWxkKCkpCgp9