kotlin - Kotlin 警告:在构造函数中访问非最终属性
问题描述
我有一些以下代码并收到producer
变量警告accessing non-final property in constructor
class KafkaService {
val producer: KafkaProducer<String, String>
init {
val props = Properties()
props[ProducerConfig.BOOTSTRAP_SERVERS_CONFIG] = "127.0.0.1:9092"
props[ProducerConfig.CLIENT_ID_CONFIG] = "DemoProducer"
props[ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
props[ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
producer = KafkaProducer(props)
}
fun sendToKafka(topic: String, message: String) {
val producerRecord: ProducerRecord<String?, String> = ProducerRecord(topic, null, message)
producer.send(producerRecord)
}
}
解决此问题的最佳方法是什么?
解决方案
您应该将producer
变量初始化为惰性:
class KafkaService {
val producer: KafkaProducer<String, String> by lazy {
val props = Properties()
props[ProducerConfig.BOOTSTRAP_SERVERS_CONFIG] = "127.0.0.1:9092"
props[ProducerConfig.CLIENT_ID_CONFIG] = "DemoProducer"
props[ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
props[ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
KafkaProducer(props)
}
fun sendToKafka(topic: String, message: String) {
val producerRecord: ProducerRecord<String?, String> = ProducerRecord(topic, null, message)
producer.send(producerRecord)
}
}
这样,您的变量将在您第一次访问它时被初始化,并且您不会重新分配最终变量。阅读本文以更好地理解。
推荐阅读
- android - 如何从 SD 卡在 web 视图中打开 .ppt、.pptx、.doc、.xlsx 文件?
- android - 当我将文本输入布局添加到我的 xml 文件时,它的工作但当我单击日期选择器类应用程序崩溃时
- python - SyntaxError:在 Python 中使用 Selenium 使用 find_element_by_xpath 时语法无效
- serialization - oneway IEnumerable 处理
- javascript - 如何通过使用 jQuery Ajax 调用来防止会话超时?
- json - 解析字典行为奇怪
- java - 如何修复 com.android.volley.ParseError: org.json.JSONExeption: Value
我有一个 listview 的自定义适配器,我想从数据库中获取项目列表并使用 json 从 php 构建 CustomArrayAdapter,但问题是我从
- c# - 将表达式树转换为字典
- performance - 过滤的最佳解决方案
- javascript - 从远程 js 文件中读取导出的变量