在Scala中的私有和受保护的构造函数

13 浏览
0 Comments

在Scala中的私有和受保护的构造函数

我一直对在Scala中没有显式主构造函数而只有类体内容的影响感到好奇。\n特别是,我怀疑私有或受保护的构造函数模式,即通过伴生对象或另一个类或对象的方法来控制构造可能没有明显的实现方式。\n我错了吗?如果是这样,该如何实现?

0
0 Comments

私有和受保护的构造函数在Scala中是被允许的,这为我们提供了一种控制对象创建的方式。在Scala中,我们可以通过在伴生对象中定义私有或受保护的构造函数来限制对象的创建。

在下面的例子中,我们可以看到如何使用Scala中的特质(trait)来实现私有和受保护的构造函数:

sealed trait Foo {
 // interface
}
object Foo {
  def apply(...): Foo = // public constructor
  private class FooImpl(...) extends Foo { ... } // real class
}

在这个例子中,我们定义了一个名为`Foo`的特质,它作为一个接口来定义对象的行为。然后,在伴生对象`Foo`中,我们定义了一个公共构造函数`apply`,该函数可以被外部代码调用来创建`Foo`对象。同时,我们还定义了一个私有类`FooImpl`,它实现了`Foo`特质,并且只能在伴生对象中被访问到。这样,我们就可以通过伴生对象来控制`Foo`对象的创建过程。

这种使用特质来实现私有和受保护构造函数的方式非常巧妙,它允许我们在创建对象时获得更多的自由度。特质可以传达所需实现的完整非私有接口,同时还可以灵活地提供实现方式。这种方式能够满足我们在使用`apply`方法创建对象时的需求,并且遵循了Scala语言的设计原则。

需要注意的是,这种方式不使用`new`关键字来创建对象。而是通过在伴生对象中调用`apply`方法来创建对象,这样可以更好地控制对象的创建过程。

当然,这种方式也有一些局限性。例如,即使我们将构造函数设置为私有,仍然有可能通过其他方式来创建对象。这可能是一个优点或缺点,取决于我们控制对象创建的原因。

总结起来,私有和受保护的构造函数在Scala中的出现是为了提供一种控制对象创建的方式。我们可以通过在伴生对象中定义私有或受保护的构造函数来限制对象的创建。使用特质来实现私有和受保护的构造函数是一种巧妙的方式,它允许我们在创建对象时获得更多的自由度,并且遵循了Scala语言的设计原则。

0
0 Comments

在Scala中,可以通过在类名和参数列表之间插入适当的关键字来将默认构造函数声明为私有/受保护的,例如:

class Foo private () { 
  /* class body goes here... */
}

这个问题的出现原因是,有人提出了一个关于在Scala中声明私有或受保护构造函数的问题,并询问这个特性是在哪本Scala书籍或语言规范中提到的。然而,并没有在现有的Scala书籍中找到关于这个特性的相关说明。经过一些研究,发现这个特性是在Scala的一个旧版本的changelog中提到的。

根据其他回答者的进一步研究,发现这个特性在一些Scala书籍中有提到,如"Programming in Scala"的第414页,Wampler的"Programming Scala"的第97页,Subramaniam的"Programming Scala"的第60页。虽然目前手头没有"Beginning Scala"的PDF来查阅,但可以确认这个特性在"Programming Scala"的第97页中有提到。

然而,尽管有这个特性,当执行以下代码时:class Person private (){} val p = new Person并不会抛出编译时错误。

0