kotlin - Kotlin:在构造函数中访问非最终属性名称
问题描述
这个问题之前已经在 Stack overflow 中得到了回答,但是由于我是 Kotlin 的新手,所以我不明白这一点。如果有人能告诉我下面的代码(用简单的语言)有什么问题以及我如何解决这个问题,那将非常有帮助。我在 Country 类的“名称”属性下收到来自 IntelliJ IDEA 的警告,提示我正在尝试访问构造函数中的非最终属性名称。那有什么问题?
open class Country (n : String? = null)
{
open var name : String? = n
init {
if (n==null)
{
this.name = "Unknown Country"
}
else
{
this.name = n
}
}
fun printCountryName()
{
println("Country Name : ${this.name}")
}
}
class India constructor(n: String? = null, p: Int, g: Double ): Country(n)
{
override var name : String? = "India"
}
解决方案
您需要记住,属性不仅仅是字段。它们是字段 + getter/setter。通过声明让您的子类name
更改. 然后,任何子类都可以这样做:open
setName()
class MyCountry : Country("foo") {
override var name: String?
get() = null
set(value) {}
}
这样,构造函数Country
将无法设置名称。
open
用于更改实现,而不是更改存储值。如果您需要一些默认值,则只需将其设置为正常:
class India constructor(p: Int, g: Double ): Country("India")
要解决您的问题,您只需删除open
from name
,因为从您的示例来看,您似乎并不真正需要它。
更新
此外,我在您的代码中看到了潜在的错误/错误:
- 如果您在构造时检查 Country name 的可空性并将 null 替换为“Unknown Country”,那么为什么
name
proeperty 是String?
而不是String
?似乎你不想在那里有空值,但仍然允许它们。 - 我想更改现有国家/地区的名称没有意义,所以我相信您可以使用
val
而不是var
.
推荐阅读
- rust - 如何“连接”一个 UDP 套接字并让操作系统选择端口和地址
- spring-boot - Spring Boot JPA 插入和更新
- delphi - 如何知道当前证书的密码是否有效
- node.js - 如何存储 Spotify api 的访问令牌。我正在使用passport.js
- neo4j - Neo4j (4.1.3) :当匹配为一个标签返回一行时如何动态创建关系
- r - R 将在 Mac 上生成一个字符串数组,但在 Windows 上是一个因素
- c# - 游戏对象上的统一位置图像无法正常工作*已修复*
- eclipse - 在 Eclipse Windows Builder 设计视图中不显示任何内容
- python - Python Try-Except 与 If-Else 性能
- c# - 使用 Graph API 和委派权限将成员添加到 Microsoft Teams