绕过Kotlin“财产瘾君子或预期的设定者”

时间:2018-04-26 13:59:23

标签: android kotlin

我需要创建一个私有字段并使用它而无需从其他类访问它。但我不能在构造函数中实例化它。 我正在为Android开发,有问题的字段screenWakeLocker无法以这种方式实例化:

class MainActivity : AppCompatActivity() {
private val screenWakeLocker: PowerManager.WakeLock = 
                            (getSystemService(Context.POWER_SERVICE) as PowerManager)
                            .newWakeLock(PowerManager.FULL_WAKE_LOCK, "")

“在onCreate()之前,活动无法使用系统服务”

所以我在OnCreate中实例化它:

class MainActivity : AppCompatActivity() {
private var game: Game = Game()
private var screenWakeLocker?: PowerManager.WakeLock;

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    screenWakeLocker = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")
}

override fun onResume(){
    super.onResume()
    screenWakeLocker.acquire()
}

并在?处获得编译错误“Property getter or setter expected”:?PowerManager.WakeLock

如何让其他类无法使用它并使用它?

2 个答案:

答案 0 :(得分:2)

您有两种选择:

  1. 选项一,如果您想使用“var”,可以添加 lateinit
  2. 选项二,您可以使用 by lazy ,其中对象在需要时进行初始化

    private lateinit var screenWakeLocker: PowerManager.WakeLock
    private val screenWakeLockerTwo by lazy {(getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")}
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        screenWakeLocker = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")
    }`
    
  3. 我认为选项二更好。

答案 1 :(得分:0)

使用lateinit关键字进行延迟初始化。

private lateinit var screenWakeLocker:PowerManager.WakeLock