Kotlin扩展函数与成员函数?
我知道在Kotlin中使用扩展函数来扩展类的功能(例如,来自库或API)。
但是,通过使用扩展功能,在代码可读性/结构方面是否有任何优势:
class Foo { ... } fun Foo.bar() { // Some stuff }
与成员职能相反:
class Foo { ... fun bar() { // Some stuff } }
?
有推荐的做法吗?
从我的角度来看,使用扩展功能有两个令人信服的理由:
-
为了“扩展”一个类的行为,你不是/不能改变的(而且继承没有意义或不可能)。
-
为特定功能提供范围。 例如,扩展函数可以被声明为独立函数,在这种情况下,它可以在任何地方使用。 或者您可以选择将其声明为另一个类的(私有)成员函数,在这种情况下,只能在该类中使用。
这听起来像你#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等
使用扩展功能的另一个原因是,您不必为了使用方法而扩展该类,就好像它们属于该类(但实际上不属于该类)。
希望它对你有点清楚..