契约资料
自定义契约示例代码
@ExperimentalContracts //由于Contract契约API还是Experimental,所以需要使用ExperimentalContracts注解声明
fun main(args: Array<String>) {
val token: String? = TokenGenerator().generateToken("kotlin")
if (checkTokenIsValid(token)) {//这里判空处理交于函数来处理,根据函数返回值做判断
println("token length is ${token.length}")//编译正常: 使用自定义契约实现,这里智能推导正常识别
}
}
@ExperimentalContracts //由于Contract契约API还是Experimental,所以需要使用ExperimentalContracts注解声明
fun checkTokenIsValid(token: String?): Boolean{
//这里契约的意思是: 调用checkTokenIsValid 如果返回true, token!=null
contract {
returns(true) implies (token != null)
}
return token != null && token.isNotBlank()
}
复制代码
注意事项
Contracts are allowed only for top-level functions
自定义契约写法如下
- 在.kt文件内直接定义方法
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@ExperimentalContracts //由于Contract契约API还是Experimental,所以需要使用ExperimentalContracts注解声明
fun checkTokenIsValid(token: String?): Boolean {
contract {
returns(true) implies (token != null)
}
return token != null && token.isNotBlank()
}
- 在类或者接口定义之前
package chinabooks.com.allbooks.utils
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@ExperimentalContracts //由于Contract契约API还是Experimental,所以需要使用ExperimentalContracts注解声明
fun checkTokenIsValid(token: String?): Boolean {
contract {
returns(true) implies (token != null)
}
return token != null && token.isNotBlank()
}
class Animal{
//xxxxxx
fun test(){
//xxxxxx
}
}
验证邮箱是否合法代码示例
@ExperimentalContracts
fun checkEmailIsValid(email: String?): Boolean {
contract {
returns(true) implies (email != null)
}
val regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?"
return email != null && email.isNotBlank()&&Pattern.matches(regex, email)
}
。。。。。。使用示例。。。。。。。。。
var test:String? = "abcd@13.com"//这里要特别注意这个?号,如果去掉问号不用契约也是可以的
if (checkEmailIsValid(test)) {
println("test length=${test.length}")
}