Kotlin扩展函数与成员函数?

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

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

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

与成员职能相反:

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

有推荐的做法吗?

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

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

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

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

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

何时使用成员函数

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

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

何时使用扩展function

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

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

为什么?

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

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

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

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

 // 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 } } 

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

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

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

根据文件,

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

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

何时创建扩展function?

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

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

希望它对你有点清楚..

  • 如何使用Android中的Kotlin从NavigationView的headerLayout中指定的布局访问视图
  • kotlin是功能性的还是程序性的?
  • 扩展函数不会创建新的Observable对象
  • 结果一样,但是测试用例没有通过单元测试
  • 无法使用Kotlin访问EditText或其他UI组件
  • 如何在父上下文中创建变量
  • 如何使用Kotlin在Android中分享图像?
  • 如何解决kotlin中通用扩展方法的签名,以解决kotlin中的“类型推断失败”
  • 在Kotlin脚本中用扩展方法问题
  • 不可空的可变映射
  • Kotlin扩展函数突然需要api等级24
  • Kotlin language will be the best programming language for Android.