Kotlin扩展函数与成员函数?

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

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

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

与成员职能相反:

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

有推荐的做法吗?

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

  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等

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

希望它对你有点清楚..