Kotlin - 最后一堂课的延伸

时间:2017-07-22 12:50:21

标签: kotlin kotlin-extension

是否可以创建像{String}这样的final类的扩展名?与 swift 一样,可以在extension final class内添加其他方法。

举个例子 - 我想在String扩展名中创建一个方法,告诉我String有密码的有效长度。

 val password : String = mEdtPassword!!.getText().toString()

 // how to define haveValidLength method in extension
 val isValid : Boolean = password.haveValidLength()

注意 - 这个例子只是为了理解extension的可用性,而不是真实场景。

3 个答案:

答案 0 :(得分:3)

是的,你可以。 Kotin extension method提供了使用新功能扩展类的功能,而无需继承类或使用任何类型的设计模式,如Decorator。

以下是String的扩展方法:

//  v--- the extension method receiver type
fun String.at(value: Int) = this[value]

以下Java生成的扩展方法代码:

public static char at(String receiver, int value){
    return receiver.charAt(value);
}

所以Kotlin中的扩展方法是使用委托而不是继承。

然后你可以像下面的成员函数一样调用扩展方法:

println("bar".at(1))//println 'a'

您还可以为现有的扩展功能编写扩展方法,例如:

fun String.substring(value: Int): String = TODO()

//    v--- throws exception rather than return "ar"
"bar".substring(1)

但是你不能为现有的成员函数编写扩展方法,例如:

operator fun String.get(value: Int): Char = TODO()

//   v--- return 'a' rather than throws an Exception
val second = "bar"[1]

答案 1 :(得分:1)

尝试添加更多详细信息,此答案可能对某人有用。

是的,我们可以向final类添加其他方法,例如String。举个例子,我想在String中添加一个方法,告诉我我的String是否有有效的密码字符数。

所以我要做的是,我创建了一个下面的函数,可以用相同的class或不同的class文件编写。

    fun String.hasValidPassword() : Boolean {

 // Even no need to send string from outside, use 'this' for reference of a String

     return !TextUtils.isEmpty(this) && this.length > 6
    }

现在从任何地方打电话

    val isValid : Boolean = password.haveValidLength()

建议

如果您的应用程序只有一个密码验证,则没有问题。

但是,如果应用程序有多个验证,我建议您不要编写这样的扩展方法hasValidPassword。由于扩展方法是 satically ,因此您无法在运行时更改hasValidPassword。因此,如果要在运行时更改验证,则应使用函数,例如:

class PasswordRepository(private val validate:(String)->Boolean){
    fun save(value:String){
        if(validate(value)){
            //TODO persist the password
        }
    }
}

val permitAll = PasswordRepository {true}
val denyAll = PasswordRepository {false}

permitAll.save("it will be persisted")
denyAll.save("it will not be persisted")

换句话说,上面的扩展方法违反Single Responsibility Principle,它会进行验证&字符串操作。

答案 2 :(得分:0)

你可以在Kotlin中使用扩展功能。通过扩展,您可以为您可以访问或无权访问的类添加额外的功能;例如遗留代码库。在Kotlin文档[{3}}中给出的示例中,swap已添加到最初没有MutableList<Int>的{​​{1}}。使用swap关键字引用交换功能将对其进行操作的对象。在下面的示例中,this引用this

testList