记一次编写Demo时SonarLint提示正告而关注到的kotlin1.4新增的接口声明办法.
// SonarLint正告: Make this interface functional or replace it with a function type.
interface GitHubService {
@GET("search/repositories?sort=stars&q=Android")
suspend fun searchRepos(@Query("page") page: Int, @Query("per_page") perPage: Int): GitHubResponse
}
// 声明为函数接口后修复正告
fun interface GitHubService {
@GET("search/repositories?sort=stars&q=Android")
suspend fun searchRepos(@Query("page") page: Int, @Query("per_page") perPage: Int): GitHubResponse
}
普通接口
当运用 interface
关键字界说接口时,能够声明笼统办法和默许办法。笼统办法是没有详细完成的办法,需要在完成接口的类中供给详细的完成。默许办法是在接口中供给了一个默许的完成,完成类能够挑选重写或许直接运用默许完成。
interface GitHubService {
fun getUser(username: String): User // 笼统办法
fun getRepositories(username: String): List<Repository> { // 默许办法
val user = getUser(username)
// 经过用户获取仓库列表的详细完成
// ...
return repositories
}
}
函数接口
运用 fun interface
声明的接口只能包括一个笼统办法,并且不能包括默许办法。这种类型的接口一般用于函数式编程和 lambda 表达式的场景。完成这个接口的类能够经过 lambda 表达式或许函数引证来供给办法的详细完成。
fun interface GitHubService {
fun getUser(username: String): User
}
// 经过 lambda 表达式为 getUser 办法供给了详细的完成。
// lambda 表达式接纳一个用户名参数,并返回对应的用户目标。
val service = GitHubService { username ->
// 经过用户名获取用户的详细完成
// ...
return user
}
常见运用场景
interface
-
界说回调接口:接口能够用作界说回调函数的契约。一个类能够完成接口并供给回调办法的详细完成,然后将完成类的实例传递给其他需要回调的组件。
-
完成多态行为:接口能够作为多态的手法,使得不同的类能够以不同的办法完成相同的接口。这种多态的特性答应在运行时依据目标的详细类型调用相应的办法。
-
界说服务接口:接口能够界说服务契约,描绘系统的服务功用,并规则服务办法的签名。其他模块或组件能够完成接口,并供给详细的服务完成。
-
界说插件机制:接口能够用于界说插件的扩展点。主应用程序界说接口,并供给默许完成,而插件能够完成这个接口并供给自界说的行为。
-
完成战略形式:接口能够用于完成战略形式,其间不同的类完成相同的接口,并供给不同的算法或战略。
fun interface
-
界说函数式接口:函数式接口只包括一个笼统办法,一般用于表示某个操作或行为。这样的接口能够作为函数类型的参数或返回值,使得函数能够被传递、组合和运用。
-
运用 lambda 表达式:函数式接口能够经过 lambda 表达式供给办法的详细完成。这种办法使得代码更加简练、易读,并支撑函数式编程的风格。
-
支撑函数引证:函数式接口能够与函数引证一同运用,答应直接引证已有的函数作为接口的完成。这样能够削减冗余的代码,并提高代码的可读性。
总而言之,interface
关键字适用于一般的接口界说和多态行为,而 fun interface
关键字则适用于函数式编程和 lambda 表达式的场景。
总结一下,interface
关键字用于界说常规的接口,能够包括笼统办法和默许办法。而 fun interface
关键字用于界说函数式接口,只能包括一个笼统办法,并且不能包括默许办法。
- Functional (SAM) interfaces