定义一个与scala中的类同名的方法是否安全?

时间:2014-05-23 05:55:49

标签: java android scala guice

我正在尝试将Scala引入我的Android项目,该项目使用Guice进行DI。对于工作指南,我需要将@Inject注释添加到我希望Guice使用的构造函数中。在我的例子中,我创建了一个Scala类,我需要在我的Java代码中使用它。

scala:
class scalaClass1(a: String) {
   var myA = a

   @Inject
   def this() = { this("test") }
}

这看起来没问题,对吗?但在另一种情况下,构造函数没有任何参数,所以我尝试了

scala:
class scalaClass2() {
   var myA: String = null

   @Inject
   def this() = { this() }
}

我遇到语法错误。像递归定义的东西。然后我尝试了这个:

scala:
class scalaClass2() {
   var myA: String = null

   @Inject
   def scalaClass2() = { this }
}

编译的代码和应用程​​序在我的手机上运行良好。我不知道为什么。我在谷歌浏览,但我找不到任何关于有一个与该类同名的方法的定义/解释。为什么会这样?我的问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

如果您需要将@Inject应用于不带参数的构造函数,可以使用:

class scalaClass2 @Inject () {
  // whatever
}

请注意必填的空括号。您需要它们在主构造函数上应用注释。但在这种特殊情况下,你甚至不需要@Inject;见下文。

在你的第二个例子中(当你定义def this() = { this() }时)你得到一个错误,因为你不能定义具有相同签名的多个构造函数,而这正是你正在做的事情 - 你定义了没有参数的主构造函数和立即定义辅助构造函数,同样没有参数。

在第三个示例中,您确实定义了一个名为scalaClass2的方法,该方法返回this。它完全有效,但它不是构造函数。据我所知,Guice在无参数构造函数中不需要@Inject注释,因为它是类中唯一的构造函数,因此您可以注入scalaClass2或从Guice中获取它,后者将为您创建它。但你真的不需要scalaClass2方法; Guice可能将其称为方法注入程序的一部分,但它不会做任何事情。

答案 1 :(得分:0)

首先,根据约定类名称应以大写开头,方法应以较低开头。但如果我们不遵循它们,我会说它不安全。

考虑使用定义了apply方法的类的伴随对象。

class Person(val name: String, val age: Int)
object Person {
  def apply(name: String, age: Int) = new Person(name, age) }

然后创建一个具有相同名称和列表参数的方法:

def Person(lastName: String, score: Int): String = s"${lastName} got ${score} points in last game"

现在,如果您想使用对象apply方法,则无法以常规方式执行此操作:

Person("McKenzie", 1000) 

将产生McKenzie got 1000 points in last game