记一次编写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
  1. 界说回调接口:接口能够用作界说回调函数的契约。一个类能够完成接口并供给回调办法的详细完成,然后将完成类的实例传递给其他需要回调的组件。

  2. 完成多态行为:接口能够作为多态的手法,使得不同的类能够以不同的办法完成相同的接口。这种多态的特性答应在运行时依据目标的详细类型调用相应的办法。

  3. 界说服务接口:接口能够界说服务契约,描绘系统的服务功用,并规则服务办法的签名。其他模块或组件能够完成接口,并供给详细的服务完成。

  4. 界说插件机制:接口能够用于界说插件的扩展点。主应用程序界说接口,并供给默许完成,而插件能够完成这个接口并供给自界说的行为。

  5. 完成战略形式:接口能够用于完成战略形式,其间不同的类完成相同的接口,并供给不同的算法或战略。

fun interface
  1. 界说函数式接口:函数式接口只包括一个笼统办法,一般用于表示某个操作或行为。这样的接口能够作为函数类型的参数或返回值,使得函数能够被传递、组合和运用。

  2. 运用 lambda 表达式:函数式接口能够经过 lambda 表达式供给办法的详细完成。这种办法使得代码更加简练、易读,并支撑函数式编程的风格。

  3. 支撑函数引证:函数式接口能够与函数引证一同运用,答应直接引证已有的函数作为接口的完成。这样能够削减冗余的代码,并提高代码的可读性。

总而言之,interface 关键字适用于一般的接口界说和多态行为,而 fun interface 关键字则适用于函数式编程和 lambda 表达式的场景。
总结一下,interface 关键字用于界说常规的接口,能够包括笼统办法和默许办法。而 fun interface 关键字用于界说函数式接口,只能包括一个笼统办法,并且不能包括默许办法。

  • Functional (SAM) interfaces