是否可以创建像{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
的可用性,而不是真实场景。
答案 0 :(得分:3)
以下是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