gpt4 book ai didi

constructor - 何时使用lateinit,init block 和伴随对象。 Kotlin

转载 作者:行者123 更新时间:2023-12-02 13:06:38 25 4
gpt4 key购买 nike

我正在开发人员网站上进行android蓝牙聊天项目,并且尝试使用Kotlin而不是Java。我是Kotlin的新手,我对使用init block和lateinit关键字以及我的伴随对象的“正确”方法有些困惑。在我发布的代码中,我没有伴随对象,但我想知道是否应该。到目前为止,我主要只是使用一个伴随对象来模仿Java的静态类成员,或者有时包含类常量。至于我的初始化块,我基本上是用于构造函数。那就是通过类声明中定义的实际构造函数传入的成员分配。至于lateinit,我用它来声明我不希望立即初始化但也不想使其可为空的成员。如果这是正确的用法,请让我知道,否则请自行更改。这是我的代码:

    inner class AcceptThread(val secure:Boolean) : Thread(){
lateinit var mmServerSocket:BluetoothServerSocket
lateinit var mSocketType:String

init {
var tmp:BluetoothServerSocket? = null
mSocketType = if (secure) "Secure" else "Insecure"

try {
if (secure){
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, UUID_SECURE)
} else{
tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, UUID_INSECURE)
}
}catch (ioe:IOException){
Log.e(TAG, "Socket Type: $mSocketType listen() failed", ioe)
}
mmServerSocket = tmp!!
mState = STATE_LISTEN
}
}

最佳答案

考虑到您要在构造函数中初始化变量,因此此处不需要lateinit。例如,如果要在诸如onCreate()之类的生命周期方法中初始化变量,则可以使用lateinit var

另外,我认为您可以重构init块以消除tmp变量:

inner class AcceptThread(val secure:Boolean) : Thread() {
val mmServerSocket: BluetoothServerSocket
val mSocketType: String = if (secure) "Secure" else "Insecure"

init {
try {
mmServerSocket = if (secure) {
mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, UUID_SECURE)
} else {
mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, UUID_INSECURE)
}
} catch (ioe: IOException) {
Log.e(TAG, "Socket Type: $mSocketType listen() failed", ioe)
}
mState = STATE_LISTEN
}

关于constructor - 何时使用lateinit,init block 和伴随对象。 Kotlin ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com