【问题标题】:How to define a parameterless constructor in Scala如何在 Scala 中定义无参数构造函数
【发布时间】:2010-07-19 20:52:39
【问题描述】:

这个问题太愚蠢了......无论如何,我只是找不到正确的信息,因为我看到的每个 Scala 构造器示例类都至少使用一个参数。

我想把这个类从 Java 翻译成 Scala:

public class SubscriptionConverter extends Converter {
  public SubscriptionConverter() {
    Context ctx = new InitialContext();
    UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/UserEJB");
  }
  (...)
}

所以我只有一个无参数的构造函数。我在 Scala 中用 this() 搞砸了,但我找不到像上面那样工作的类似示例。 我如何在 Scala 中编写它?

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    在类级别声明的任何语句都作为默认构造函数的一部分执行。所以你只需要这样做:

    class SubscriptionConverter extends Converter {
      val ctx = new InitialContext
      val userEJB = ctx.lookup("java:global/teachernews/UserEJB")
      (...)
    }
    

    【讨论】:

    • 你可能想要声明这些 vals private -- 否则它们将是公共字段。
    • 请注意,上面的示例不会产生与问题中的代码相同的效果。在该代码中,变量在方法范围内是本地的,而在这里它们进入对象的每个实例。 Scala 2.8 的locally 可能在这里用来引入一个块。
    • @Daniel 我在哪里可以了解更多关于本地的信息?找不到任何信息,甚至在 2.8 语言参考中也找不到
    • @ifischer locally 是在 scala.Predef 上定义的,它真的没有任何事情。这只是为了让悬空块(嵌套块)看起来更好。
    【解决方案2】:

    @dbyrne 已经介绍了最重要的部分,但我会补充一些细节。

    1. 如果一个类没有参数,并且它是不可变的,请考虑将其声明为一个对象。
    2. 由类级别的语句和类名后面的参数列表定义的构造函数称为主构造函数。 * 辅助构造函数* 由def this() = ... 定义。与 Java 不同,每个辅助构造函数都必须委托给主构造函数。
    3. 当您声明具有零参数列表的主构造函数时,编译器将自动添加一个空参数列表。如果你定义一个带有一个隐式参数列表的构造函数,编译器会在这个之前添加一个空参数列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-08
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多