因此,Scala以处理字段的方式偏离了Java。 Java方法是定义它们,然后在构造函数中实例化它们。据我了解,Scala在构造函数中都做了。但是,作为游戏开发框架LibGDX的一部分,我正在扩展一个完全不同的Java类。我的代码看起来像这样:
class HelloWorld extends Game {
private var batch: SpriteBatch = null
private var font: BitmapFont = null
override def create(): Unit = {
batch = new SpriteBatch
font = new BitmapFont
font.setColor(Color.RED)
}
override def dispose(): Unit = {
batch.dispose()
font.dispose()
}
override def render(): Unit = {
Gdx.gl.glClearColor(1, 1, 1, 1)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
batch.begin()
font.draw(batch, "Hello, world!", 200, 200)
batch.end()
}
}
因为该类没有真正的构造函数而是使用create
创建,所以我无法在create
中创建变量并让其他方法可见,这导致我如何#&# 39;我在这里完成了。然而,这迫使我使用vars,因为它们应该真的是vals。我错过了什么吗?有没有更好的方法来做到这一点,或者因为我正在使用特定于Java的框架, 会变得难以理解?
private val batch = new SpriteBatch
因为你无法调用LibGDX的对象构造函数,直到它自己初始化(然后可以调用create
)。
答案 0 :(得分:2)
也许你可以围绕Java API编写一个更易于Scala的包装器?
trait ScalaGame {
def dispose()
def render()
}
class GameWrapper(createGame: => ScalaGame) extends Game {
lazy val game = createGame
override def create() { game }
override def dispose() = game.dispose()
override def render() = game.render()
}
然后:
class HelloWorld extends ScalaGame {
private val batch: SpriteBatch = new SpriteBatch
private val font: BitmapFont = new BitmapFont
font.setColor(Color.RED)
override def dispose(): Unit = {
batch.dispose()
font.dispose()
}
override def render(): Unit = {
Gdx.gl.glClearColor(1, 1, 1, 1)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
batch.begin()
font.draw(batch, "Hello, world!", 200, 200)
batch.end()
}
}
val game = new GameWrapper(new HelloWorld)