我不明白为什么可以在Kotlin的课堂外写一个函数?这是一个好习惯吗?
例如,在Kotlin中可以在docker-compose.yml
类之外编写函数:
MainActivity
在Java中,这是不可能的!这不是面向对象语言如何正常工作,对吗?
在文档中,他们讨论了经典函数的本地函数,以及在类或对象中定义的函数的成员函数,但他们不解释什么时候使用其中一个更好。
答案 0 :(得分:26)
在Java中,这是不可能的!这不是面向对象语言如何正常工作,对吧?
暂停一下,重新考虑java静态方法的本质。一个类应该是对象的蓝图,描述它们的行为和状态。但是你可以在不创建任何实例的情况下调用静态方法。
这如何适应面向对象的图片?静态方法如何“属于”它声明的类?
实际上,静态方法在Java中是一种破解,它们会污染和滥用类的OOP概念。但是你多年来习惯了他们,所以你不再那么想了。
从概念上讲,静态方法是顶级函数,Java使用其声明类的名称作为其命名空间。与此相反,Kotlin允许您声明顶级函数,而不会滥用类的命名空间。
答案 1 :(得分:13)
是的,这是一种很好的做法。 Kotlin不是一种纯粹的面向对象的语言,因此没有义务遵循面向对象语言如何正常工作的方式。 (即使其他面向对象的语言,如C ++,Ruby和Python,也允许顶级函数)。
当此函数的逻辑不明确属于任何类时,使用顶级函数会更好。
答案 2 :(得分:0)
是的,创建包级函数是一种很好的做法,如果函数逻辑与类的属性和生命周期无关。示例:
包级函数的主要好处是简单(可以更好地维护):函数的调用者无需声明和创建对象即可调用函数。 (如果需要从Java代码调用您的包级函数,则会失去此好处,因为Java调用代码必须使用Kotlin生成的类名。)
重要提示:尽管您没有函数的类词法作用域,但单责任原则(SRP)仍然适用 。不要创建一个Kotlin源文件(例如Util.kt),并使用缺乏内聚力的功能(即,执行无关功能的功能)对其进行膨胀。