java - comapion 对象而不是静态方法和字段有什么好处?
问题描述
我问自己为什么 Kotlin 使用伴随对象而不是静态方法和字段?它是样板的减少吗?我认为在花括号内编写具有所有属性和函数的伴随对象比每次都编写静态更容易。这是一个例子。
class Hero {
companion object {
private var numberOfHeroes = 0
fun addNewHero() {
numberOfHeroes++
}
fun deleteHero() {
numberOfHeroes--
}
fun getAllHeroes(): Int {
return numberOfHeroes
}
}
init {
addNewHero()
}
}
fun main() {
val h1 = Hero()
val h2 = Hero()
print("Number of heros: ${Hero.getAllHeroes()}") // result is 2
}
但这是唯一的好处吗?我知道简洁对 Kotlin 来说非常重要,但我认为还会有更多。
解决方案
做一个或另一个没有好处(或缺点,就此而言)。它只是一种语言结构。而且,坦率地说,你应该问一下伴随对象和扩展函数与静态方法相比有什么好处。
Java 和大多数其他 OO 语言在必须只存在一个字段实例的情况下选择使用静态字段,在以下情况下使用静态方法:a)类的实例无关紧要或不重要,或 b)它实际上有点,但是编写静态方法的开发人员无法控制类,即用户想要扩展现有类的功能,他/她不是原作者(提供实用程序功能所以说话)。
后者的示例将是String
该类的实用方法,用于检查所讨论的字符串是否为空白(仅包含空格或空)。String
最终用户无法直接更改该类,因此需要使用静态方法编写实用程序类。这个任务在 Kotlin 中使用扩展函数和/或属性完美地解决了。
推荐阅读
- python - 从python中的文本文件中读取特定数据
- vba - 当用户单击表单上的文本框时,如果还没有 ID,我需要为当前记录分配一个 ID
- django - Django - 基于客户端设备的 CKeditor 动态图像大小
- python - python Mysql中的分层数据库
- javascript - 使用 Javascript/JQuery 在 HTML 表中动态填充新行
- angular - 如何使用 xlink:href 主机绑定获取组件以在启用 ivy 的情况下以角度工作
- python - 在 xpath Python 中查找隐藏的文本
- python - 限制 tag.text 的深度
- python - 使用 .to_numpy() 将特定列从 Pandas Dataframe 的一行复制到另一行
- reinforcement-learning - 了解 pytorch 中正态分布的 log_prob