Scala在IntelliJ IDE中应用构造器模式的快速文档

时间:2018-06-27 15:15:58

标签: scala intellij-idea documentation apply intellij-plugin

我想知道是否有一种方法可以使IntelliJ中的快速文档适用于许多Scala开发人员在下面使用的类构造模式。

SomeClass(Param1,Parma2)

代替

new SomeClass(param1,Param2)

用new进行的直接构造函数调用显然是可行的,但是许多scala开发人员将其应用于构造对象。使用该模式时,Intelij文档查找无法找到有关该类的任何信息。

1 个答案:

答案 0 :(得分:0)

我不知道IntelliJ本身是否有文件。但是,这种模式很容易解释。

Java代码中有一种模式具有静态工厂方法(这是“四工厂方法模式”的一种特殊形式),通常遵循(翻译成Scala-ish)的意思:

object Foo {
  def barInstance(args...): Bar = ???
}

这样做的主要好处是工厂控制了对象的实例化,尤其是:

  • 要实例化的特定运行时类,可能基于工厂的参数。例如,Scala中的通用不可变集合具有工厂方法,如果它们以足够少量的内容创建,它们可能会创建优化的小型集合。这样的一个例子是长度为1的序列可以实现,基本上没有开销,可以使用单个字段引用对象并执行查找以检查偏移量是否为0并抛出或返回其唯一字段。

  • 是否创建了实例。可以将参数缓存到工厂,并记住或“散列”创建的对象,或者预先创建最常见的实例并反复分发。

另一个好处是工厂是一个函数,而new是一个运算符,它允许工厂被传递:

class Foo(x: Int)

object Foo {
  def instance(x: Int) = new Foo(x)
}

Seq(1, 2, 3).map(x => Foo(x))  // results in Seq(Foo(1), Foo(2), Foo(3))

在Scala中,这与以下事实结合在一起:该语言允许将定义apply方法的任何对象在语法上用作函数(即使它没有扩展Function,这也会允许将该对象像一个函数一样传递出去,并与“伴侣对象”一起传递给一个类(该类包含了Java中将static包含在类中的东西),从而得到了类似的东西:

class Foo(constructor_args...)

object Foo {
  def apply(args...): Foo = ???
}

可以这样使用:

Foo(...)

对于case class,Scala编译器会自动生成具有某些行为的伴随对象,其中之一是与构造函数具有相同参数的apply(其他行为包括遵循{{1 }}和hashCode以及允许模式匹配的equals方法。