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