在Scala中处理未实例化的类变量的正确方法是什么?

时间:2014-06-24 07:42:20

标签: scala libgdx

因此,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)。

1 个答案:

答案 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)