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

Jéw*_*ôm' 25 java android kotlin

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

例如,在Kotlin中可以在我的MainActivity课外编写一个函数:

fun hello(){}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        hello()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在文档中,他们讨论了经典函数的本地函数和类或对象中定义的函数的成员函数,但它们没有解释何时使用其中一个或哪一个更好.

Mar*_*nik 37

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

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

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

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

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

  • 不,函数名用包名限定。 (2认同)

yol*_*ole 14

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

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


Pau*_*son 6

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

  • 将每加仑英里数转换为每升公里数的函数独立于任何对象,并且非常适合包装级别。
  • otoh,取消预订的函数自然会与特定的预订对象相关联,并且非常适合这样的类。

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

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