代码之家  ›  专栏  ›  技术社区  ›  Abner Escócio

在Kotlin上默认带有final注释的类:什么是真正的动机?

  •  2
  • Abner Escócio  · 技术社区  · 6 年前

    文档告诉我们以下关于 open annotation

    类上的open注释与Java的final相反:它 允许其他人从该类继承。默认情况下,所有类 Kotlin是最终的,对应于 Effective Java, 3rd Edition , 第19条:设计和文件的继承或其他禁止。

    我的课程

    class Foo //I can't inherit it
    open class Bar //I can inherit it
    

    那么,默认情况下,所有课程的真正动机是什么?表演有什么收获吗?或者只是一种设计模式?为什么禁止 open 默认情况下?

    1 回复  |  直到 6 年前
        1
  •  4
  •   devLui    6 年前

    对我来说有两个原因:

    首先,Kotlin从函数式编程世界中汲取了许多思想,并尽可能频繁地使用不变性来避免 known problems with mutation .

    所以在默认情况下声明每个类“final”是(至少对我来说)类似的。

    在运行时无法更改或更改类(使用类似于反射的东西),这将使Kotlin编译器的安全检查无效。

    所以如果你想“变异”一个类的默认实现,你必须显式地将它标记为open。

    我想到的第二个想法是遗产经常被滥用。 介绍了几种常见的陷阱 here

    这是原则” Favor composition over inheritance “作为更好设计的指导方针。因此,默认情况下,将每个类声明为final会迫使开发人员至少停一下,考虑其他解决问题的方法,而不是出于错误的原因使用继承。

    但是,由于kotlin开发人员没有正式声明,我只能给出一个自以为是的答案。