comapion 对象而不是静态方法和字段有什么好处?

What is the benefit of comapion objects instead of static method and fields?

我问自己,为什么 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) [=23 的实例的情况下使用静态方法=] 无关紧要或不重要,或者 b) 它实际上有点作用,但是编写静态方法的开发人员无法控制 class,即用户想要扩展现有 [=] 的功能23=],其中he/she不是原作者(可以说是提供效用函数)。

后者的示例是 String class 的实用方法,它检查所讨论的字符串是否为空(仅由空格组成或为空)。最终用户无法直接更改 String class,因此需要使用静态方法编写实用程序 class。这个任务在 Kotlin 中使用扩展函数 and/or 属性得到完美解决。