我不明白为什么在Kotlin中可以在类外写函数?这是一个好的实践吗?
例如,在Kotlin中可以在MainActivity
类之外编写一个函数:
fun hello(){}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
hello()
}
}
在Java中,这是不可能的!这不是面向对象语言的正常工作方式,对吗?
在文档中,他们谈到了Local Functions(用于经典函数)和Member Functions(用于在类或对象内部定义的函数),但他们没有解释何时使用其中一个函数更好。
3条答案
按热度按时间7cwmlq891#
在Java中,这是不可能的!这不是面向对象语言的正常工作方式,对吗?
停一下,重新考虑一下java静态方法的本质。类应该是对象的蓝图,描述它们的行为和状态。但是你可以调用一个静态方法而不创建任何示例。
这是如何适应面向对象的图景的?一个静态方法如何“属于”它所声明的类?
实际上,静态方法是顶级函数,类只为它们提供了一个命名空间。严格地说,从你提出的OOP的Angular 来看,它们是一个黑客。但是你已经习惯了它们多年,所以你不再觉得这一点。
与此相反,Kotlin允许你声明顶级函数,而不需要强制你将它们的名字与类相耦合。有时候你明确地想要将顶级函数与类相耦合,这就是Kotlin中伴随对象的作用。
ia2d9nvy2#
Kotlin不是一种纯粹的面向对象语言,所以它没有义务遵循“面向对象语言的正常工作方式”(尽管其他面向对象语言,如C++、Ruby和Python,也允许顶级函数)。
如果顶级函数的逻辑不明显属于任何类,则最好使用该函数。
k4aesqcs3#
是的,如果函数逻辑独立于类的属性和生命周期,创建包级函数是一个很好的做法。例如:
包级函数的主要优点是简单(因此可维护性更好):函数的调用者不需要声明和创建一个对象来调用函数。(如果包级函数需要从Java代码中调用,那么这个好处就失去了,因为Java调用代码必须使用Kotlin生成的类名。)
重要提示:虽然你的函数没有类词法作用域,但是单责任原则(SRP)仍然适用。不要创建一个Kotlin源文件,比如说Util.kt,然后用缺乏内聚的函数(也就是做不相关事情的函数)来膨胀它。