如果我有多种方式创建对象,我应该在我的伴侣对象中使用多个套用方法吗?如果有多种申请方法,我更喜欢单一申请方法,这会让人很难看。但是,如果我有多种方式来构建我的对象,这意味着我回到了标准的构建器模式,因为我在java中使用。 (Companion.forBla.withBla.withBla)有没有比Companion.forBla.withBla.withBla更适合scala伴侣对象的构建模式?
3
A
回答
5
你需要一个builder和factory method区分。
一个建设者用于避免伸缩构造在其中创建多个构造函数,使用户能够创建具有不同属性的对象。因此,在伴随对象中使用多个apply
方法会导致这种伸缩构造函数,并可能导致混乱的代码(反模式)。一个例子是:
case class ComplexClass(foo: String, bar: Int)
case class ComplexClassBuilder(foo: Option[String], bar: Option[Int]){
def withFoo(f: String) =
this.copy(foo = Some(f))
def withBar(b: Int) =
this.copy(bar = Some(b))
def finish = {
// this is the place to decide what happens if there are missing values
// possible ways to handle would be to throw an exception, return an option or use defaults
ComplexClass(foo getOrElse ":D", bar getOrElse 42)
}
}
甲工厂方法常用于使多态性。一个apply
方法是实现一个工厂方法
trait C
case class Foo() extends C
case class Bar() extends C
object C {
def apply(isAwesome: Boolean): C = isAwesome match {
case true => Foo()
case false => Bar()
}
}
的一个好办法,但一如既往,那些图案不是规则。通常使用一种或两种应用方法来创建具有不同参数的对象。但是,如果您需要设置许多不同的值,则应该避免使用方法并实施构建器。
2
你的问题听起来像一个意见或口味的问题。 (为什么你认为有多个apply
方法是丑陋的?)。
方法的参数可以有默认值和参数可以命名为:
class MySomething(val one: String, val two: Int)
object MySomething {
def apply(one: String = "hello", two: Int = 0) = new MySomething(one, two)
}
// Creates a MySomething with one = "hello" and two = 0
val a = MySomething()
// Creates a MySomething with one = "bye" and two = 0
val b = MySomething("bye")
// Creates a MySomething with one = "hello" and two = 2
val c = MySomething(two = 2)
相关问题
- 1. Scala:在伴侣对象中获得伴侣类
- 2. scala如何对待伴侣对象?
- 3. 作为scala工厂的伴侣对象
- 4. Scala:伴侣对象和“新”关键字
- 5. Scala伴侣对象与Vs. Scala的新对象类
- 6. Scala:哪些类不应该有伴侣对象?
- 7. Scala中的伴侣对象并没有将自己与案例类相关
- 8. 斯卡拉伴侣对象模板(Iterator.tabulate)
- 9. 无法从伴侣对象访问伴侣类的方法
- 10. 从伴侣对象获取隐式val
- 11. Eclipse Scala IDE“无法找到其伴侣伴侣库”
- 12. Scala:使用伴侣对象的父级的受保护方法
- 13. scala:防止伴侣对象隐藏原始类的定义
- 14. Scala在伴侣对象中的应用方法
- 15. Scala中的通用伴侣对象超类型
- 16. Scala:在伴侣对象中使用隐含
- 17. 访问类型的伴侣对象
- 18. python中的MongoSpark伴侣对象
- 19. 伴侣类型的Scala类型约束
- 20. 伴侣中的隐式类
- 21. 何时使用/制作伴侣对象?
- 22. 伴侣的对象 - 没有Android的希望其注册为活动
- 23. 为什么我没有看到扩展类的伴侣对象组件?
- 24. scala中的伴随对象
- 25. 伴侣对象和Kotlin中没有课程的乐趣之间哪种方式更好?
- 26. 从文件构建具体对象。有没有适合这个的设计模式?
- 27. Scala:生成伴随对象
- 28. 我可以在Scala中声明该类中的伴侣对象吗?
- 29. BB伴侣为WordPress
- 30. 为什么我无法访问Scala中类的伴侣对象中的私有类方法?