And*_*nin 11
内联类只是对原始类型和字符串的某种类型化包装。
例如,假设我们有一个这样的接口声明:
interface ResizeableView {
fun resize(width: Int, height: Int)
}
Run Code Online (Sandbox Code Playgroud)
每次开发者需要调用这个方法时,他都需要先检查参数顺序,以免混淆宽度和高度。
还有,如果参数最终搞砸了怎么办?
val width: Int = someObject.width
val height: Int = someObject.height
resizeableView.resize(height, width) //compiles ok and brings a bug to the program
Run Code Online (Sandbox Code Playgroud)
这个例子简单明了,但对于其他一些情况,当一个方法声明一堆符合单一类型的原始类型参数时,程序的不想要的行为不容易理解,因此检测到参数混淆。
内联类对此有帮助:
inline class Width(val value: Int)
inline class Height(val value: Int)
interface ResizeableView {
fun resize(width: Width, height: Height)
}
Run Code Online (Sandbox Code Playgroud)
因为Width和Height现在是不同的类型,所以在调用方法时消除了混淆。
val width: Width = someObject.width
val height: Height = someObject.height
resizeableView.resize(height, width) //compile-time error
Run Code Online (Sandbox Code Playgroud)
但是inline这里的修饰符有什么意义呢?为什么不使用class Width?关键是inline classes只在编译类型时引入类型,并且在运行时这些变量将只是int-s,因此不会创建运行时开销。
这是内联类应用程序的一个很好的真实世界示例。
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |