我想知道是否有一种方法可以使IntelliJ中的快速文档适用于许多Scala开发人员在下面使用的类构造模式。
SomeClass(Param1,Parma2)
代替
new SomeClass(param1,Param2)
用new进行的直接构造函数调用显然是可行的,但是许多scala开发人员将其应用于构造对象。使用该模式时,Intelij文档查找无法找到有关该类的任何信息。
答案 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
方法。