如何为';声明构造函数;对象';Scala中的类类型?即,针对单例的一次性操作

如何为';声明构造函数;对象';Scala中的类类型?即,针对单例的一次性操作,scala,Scala,我知道对象在scala中的处理方式非常类似于单例。然而,我一直无法找到一种优雅的方法来指定初始实例化的默认行为。我可以通过将代码放入对象声明的主体中来实现这一点,但这似乎过于粗糙。使用应用程序并不能真正起作用,因为它可以被多次调用,对于这个用例来说没有意义 有什么想法吗?对象和类声明的主体是默认的构造函数,放置在其中的任何代码都将在第一次引用时执行,因此这正是实现的方法。类和对象都会在实例化时按设计在其主体中运行代码。为什么这是“黑客”?这就是语言的工作原理。如果您喜欢额外的大括号,您可以始终使

我知道对象在scala中的处理方式非常类似于单例。然而,我一直无法找到一种优雅的方法来指定初始实例化的默认行为。我可以通过将代码放入对象声明的主体中来实现这一点,但这似乎过于粗糙。使用应用程序并不能真正起作用,因为它可以被多次调用,对于这个用例来说没有意义


有什么想法吗?

对象和类声明的主体是默认的构造函数,放置在其中的任何代码都将在第一次引用时执行,因此这正是实现的方法。

类和对象都会在实例化时按设计在其主体中运行代码。为什么这是“黑客”?这就是语言的工作原理。如果您喜欢额外的大括号,您可以始终使用它们(它们将使局部变量不被保留,并且不可在世界范围内查看)

对象已初始化{
//初始化块
{
val someStrings=List(“A”、“Be”、“Sea”)
someStrings.filter(u.contains('e')).foreach(s=>println(“contains e:+s))
}
def doSomething{println(“我是在您看到这个之前初始化的。”)}
}
scala>Initialized.doSomething
包含e:Be
海洋
在你看到这个之前我已经初始化了。
scala>Initialized.SomeString
:9:错误:值SomeString不是已初始化对象的成员
已初始化.someStrings

如果它让您感觉更好,您可以使用受保护的构造函数创建一些类,
对象将创建此类的单例:

sealed class MyClass protected (val a: String, b: Int) {
  def doStuff = a + b
}

object MyObject extends MyClass("Hello", b = 1)
另外请注意,
sealed
停止扩展
MyClass
的其他类和对象,
protected
将不允许创建其他
MyClass
实例

但我个人认为,在对象的主体中,某些代码没有任何问题。您还可以创建一些方法,如
init
,然后调用它:

object MyObject {
  init()

  def init() {
    ...
  }
}

Rex是对的,我只是想指出一个我经常使用的模式,它可以避免使用变量,同时避免中间值对名称空间的污染

object Foo {
  val somethingFooNeeds = {
    val intermediate = expensiveCalculation
    val something = transform(intermediate)
    something
  }
}

你知道,我想我想我想得太多了,真的只是想用一种标准的方式来做。这正是我所尝试的,但我不想仅仅因为代码正常工作就使用它:)谢谢!我同意最初的海报,将代码作为构造函数放入类的主体看起来很难看——更像是一个脚本而不是一个类。这里给出的答案与我的做法相同,也是因为它模仿Java实例初始值设定项(而不是构造函数)的行为。在我看来,它更干净。init方法是一个很好的主意。我只担心它在某个时候可能会在类内被调用。很高兴听到第一个块的方法是标准的。谢谢
object Foo {
  val somethingFooNeeds = {
    val intermediate = expensiveCalculation
    val something = transform(intermediate)
    something
  }
}