android 在Kotlin中,为什么可以在类之外编写函数?

bgtovc5b  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(161)

我不明白为什么在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(用于在类或对象内部定义的函数),但他们没有解释何时使用其中一个函数更好。

7cwmlq89

7cwmlq891#

在Java中,这是不可能的!这不是面向对象语言的正常工作方式,对吗?
停一下,重新考虑一下java静态方法的本质。类应该是对象的蓝图,描述它们的行为和状态。但是你可以调用一个静态方法而不创建任何示例。
这是如何适应面向对象的图景的?一个静态方法如何“属于”它所声明的类?
实际上,静态方法是顶级函数,类只为它们提供了一个命名空间。严格地说,从你提出的OOP的Angular 来看,它们是一个黑客。但是你已经习惯了它们多年,所以你不再觉得这一点。
与此相反,Kotlin允许你声明顶级函数,而不需要强制你将它们的名字与类相耦合。有时候你明确地想要将顶级函数与类相耦合,这就是Kotlin中伴随对象的作用。

ia2d9nvy

ia2d9nvy2#

Kotlin不是一种纯粹的面向对象语言,所以它没有义务遵循“面向对象语言的正常工作方式”(尽管其他面向对象语言,如C++、Ruby和Python,也允许顶级函数)。
如果顶级函数的逻辑不明显属于任何类,则最好使用该函数。

k4aesqcs

k4aesqcs3#

是的,如果函数逻辑独立于类的属性和生命周期,创建包级函数是一个很好的做法。例如:

  • 将每加仑英里数转换成每升公里数的函数独立于任何对象,
  • 此外,取消预订的函数将自然地与特定预订对象相关联,并且很好地适合于这样的类。

包级函数的主要优点是简单(因此可维护性更好):函数的调用者不需要声明和创建一个对象来调用函数。(如果包级函数需要从Java代码中调用,那么这个好处就失去了,因为Java调用代码必须使用Kotlin生成的类名。)

重要提示:虽然你的函数没有类词法作用域,但是单责任原则(SRP)仍然适用。不要创建一个Kotlin源文件,比如说Util.kt,然后用缺乏内聚的函数(也就是做不相关事情的函数)来膨胀它。

相关问题