2

我需要一个需要在调用时初始化的矩形。

这是我的代码;

class EpheButton private constructor(
    private val text: String,
    private val x: Float,
    private val y: Float,
    private val projectionMatrix: Matrix4) : Disposable {
private val spriteBatch: SpriteBatch = SpriteBatch()
private val bitmapFont: BitmapFont = BitmapFont()
private val shapeRenderer: ShapeRenderer = ShapeRenderer()

private val textWidth: Float
private val textHeight: Float
private val rectangle :Rectangle by lazy { Rectangle(x, y, textWidth, textHeight) }

init {
    bitmapFont.data.setScale(2f)
    bitmapFont.region.texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear)
    bitmapFont.color = Color.BLUE
    val layout = GlyphLayout()
    layout.setText(bitmapFont, text)
    textWidth = layout.width
    textHeight = layout.height
}

我得到的那行错误private val rectangle :Rectangle by lazy { Rectangle(x, y, textWidth, textHeight) }

必须初始化变量“textWidth” 必须初始化变量“textHeight”

但我已经在init{}代码块上初始化它们。

我究竟做错了什么?

4

1 回答 1

3

在 kotlin 中,您必须在使用变量之前对其进行初始化,您正在为 Rectangle 使用惰性初始化程序,但编译器不知道textWidthtextHeight的状态

所以类看起来像这样

class EpheButton private constructor(
    private val text: String,
    private val x: Float,
    private val y: Float,
    private val projectionMatrix: Matrix4) : Disposable {
private val spriteBatch: SpriteBatch = SpriteBatch()
private val bitmapFont: BitmapFont = BitmapFont()
private val shapeRenderer: ShapeRenderer = ShapeRenderer()

private val textWidth: Float
private val textHeight: Float
init {
    bitmapFont.data.setScale(2f)
    bitmapFont.region.texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear)
    bitmapFont.color = Color.BLUE
    val layout = GlyphLayout()
    layout.setText(bitmapFont, text)
    textWidth = layout.width
    textHeight = layout.height
}
private val rectangle :Rectangle by lazy { Rectangle(x, y, textWidth, textHeight) }

更新:- 为什么初始化顺序在这里?

我们可以将这种奇怪的行为称为 Kotlin 的Null-Safty。当我们改变init 块变量声明的顺序时,我们就打破了这个规则。

来自 Kotlin 官方文档:-

Kotlin 的类型系统旨在从我们的代码中消除 NullPointerException。NPE 的唯一可能原因可能是

  1. 显式调用 throw NullPointerException();

  2. 的使用!!下面描述的运算符;

  3. 外部 Java 代码导致它;

  4. 在初始化方面存在一些数据不一致(在某处使用了构造函数中可用的未初始化的this )。

除了这四个条件之外,它始终确保变量在编译时被初始化。与我们的情况相同,它只是确保使用的变量必须在使用之前进行初始化。

于 2017-12-06T00:41:22.047 回答