Kotlin扩展函数与成员函数?

我知道在Kotlin中使用扩展函数来扩展类的功能(例如,来自库或API)。

但是,通过使用扩展功能,在代码可读性/结构方面是否有任何优势:

class Foo { ... } fun Foo.bar() { // Some stuff } 

与成员职能相反:

 class Foo { ... fun bar() { // Some stuff } } 

有推荐的做法吗?

3 Solutions collect form web for “Kotlin扩展函数与成员函数?”

从我的角度来看,使用扩展功能有两个令人信服的理由:

  1. 为了“扩展”一个类的行为,你不是/不能改变的(而且继承没有意义或不可能)。

  2. 为特定功能提供范围。 例如,扩展函数可以被声明为独立函数,在这种情况下,它可以在任何地方使用。 或者您可以选择将其声明为另一个类的(私有)成员函数,在这种情况下,只能在该类中使用。

这听起来像你#1不是一个问题,所以它真的更多的是#2。

何时使用成员函数

如果满足以下所有条件,则应使用成员函数:

  • 代码最初是在Kotlin中编写的
  • 您可以修改代码
  • 该方法是有意义的,可以使用任何其他代码

何时使用扩展功能

如果符合以下任何条件,您应该使用扩展功能:

  • 代码最初是用Java编写的,你想要添加用Kotlin编写的方法
  • 您无法更改原始代码
  • 你需要一个特殊的函数,只对代码的特定部分有意义

为什么?

一般来说,成员函数比扩展函数更容易找到,因为它们保证在它们所属的类(或超级类/接口)中。

它们也不需要被导入到所有使用它们的代码中。

扩展功能与您创建的实用功能类似。

一个基本的例子是这样的:

 // Strings.kt fun String.isEmail() : Boolean { // check for email pattern and return true/false } 

这个代码可以写成Java中的一个实用函数,如下所示:

 class StringUtils { public static boolean isEmail(String email) { // check for email pattern and return true/false } } 

所以它本质上是做的是,调用与你所调用的对象相同的函数将作为第一个参数传递给参数。 就像我在Java给出的例子一样。

如果你想调用java中的kotlin创建的扩展函数,你需要传递调用者作为第一个参数。 喜欢,

 StringsKt.isEmail("example@example.com") 

根据文件,

扩展实际上并不修改它们扩展的类。 通过定义扩展,不要将新成员插入到类中,而只需使用这种类型的变量的点符号来调用新函数。

它们只是静态函数,调用者作为第一个参数,其他参数紧跟其后。 它只是扩展了我们这样写的能力。

何时创建扩展功能?

  • 当你不能访问那个类时。 当这个类属于某个库,你还没有创建。
  • 对于原始类型。 Int,Float,String等

使用扩展功能的另一个原因是,您不必为了使用方法而扩展该类,就好像它们属于该类(但实际上不属于该类)。

希望它对你有点清楚..

  • Kotlin扩展函数突然需要api等级24
  • 无法使用Kotlin访问EditText或其他UI组件
  • 受保护的成员无法通过扩展功能访问?
  • Kotlin扩展功能访问Java专用字段
  • 如何创建Kotlin DSL - DSL语法Kotlin
  • Android Kotlin Extension超级通话
  • 在android java类中使用Kotlin扩展
  • 如何检查kotlin中的“instanceof”类?
  • 需要Kotlin函数什么都不是,而是定义为一个不同的types
  • 布尔扩展函数
  • 如何使用Kotlin在Android中分享图像?
  • Kotlin language will be the best programming language for Android.