为什么可以在Kotlin的课堂外写一个函数?

时间:2018-02-27 16:56:59

标签: java android kotlin

我不明白为什么可以在Kotlin的课堂外写一个函数?这是一个好习惯吗?

例如,在Kotlin中可以在docker-compose.yml类之外编写函数:

MainActivity

在Java中,这是不可能的!这不是面向对象语言如何正常工作,对吗?

在文档中,他们讨论了经典函数的本地函数,以及在类或对象中定义的函数的成员函数,但他们不解释什么时候使用其中一个更好。

3 个答案:

答案 0 :(得分:26)

  

在Java中,这是不可能的!这不是面向对象语言如何正常工作,对吧?

暂停一下,重新考虑java静态方法的本质。一个类应该是对象的蓝图,描述它们的行为和状态。但是你可以在不创建任何实例的情况下调用静态方法。

这如何适应面向对象的图片?静态方法如何“属于”它声明的类?

实际上,静态方法在Java中是一种破解,它们会污染和滥用类的OOP概念。但是你多年来习惯了他们,所以你不再那么想了。

从概念上讲,静态方法是顶级函数,Java使用其声明类的名称作为其命名空间。与此相反,Kotlin允许您声明顶级函数,而不会滥用类的命名空间。

答案 1 :(得分:13)

是的,这是一种很好的做法。 Kotlin不是一种纯粹的面向对象的语言,因此没有义务遵循面向对象语言如何正常工作的方式。 (即使其他面向对象的语言,如C ++,Ruby和Python,也允许顶级函数)。

当此函数的逻辑不明确属于任何类时,使用顶级函数会更好。

答案 2 :(得分:0)

是的,创建包级函数是一种很好的做法,如果函数逻辑与类的属性和生命周期无关。示例:

  • 将英里/加仑转换为公里/升的功能与任何对象无关,并且非常适合包装级别。
  • otoh,取消保留的功能自然会与特定的保留对象相关联,并且非常适合此类。

包级函数的主要好处是简单(可以更好地维护):函数的调用者无需声明和创建对象即可调用函数。 (如果需要从Java代码调用您的包级函数,则会失去此好处,因为Java调用代码必须使用Kotlin生成的类名。)

重要提示:尽管您没有函数的类词法作用域,但单责任原则(SRP)仍然适用 。不要创建一个Kotlin源文件(例如Util.kt),并使用缺乏内聚力的功能(即,执行无关功能的功能)对其进行膨胀。