让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
来源:互联网 发布:农村开淘宝网店 编辑:程序博客网 时间:2024/05/17 03:09
上一篇我们介绍了缩短五倍的Java bean,不知道你在看的时候有没有一种疑问捏?
本文同步自博主的私人博客wing的地方酒馆
再来回顾一下,两种代码的对比
public class User { private String name; private String id; public User(String name, String id) { this.name = name; this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public String getId() { return id;}public void setId(String id) { this.id = id;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
data class User(var name: String, var id: String)
- 1
- 2
- 3
- 1
- 2
- 3
可以发现,代码是少了,但是好像不太一样,为什么呢? 可能很多人会有这样的疑问,在Java bean中 通常会将成员变量设为私有,不对外开放,并且提供getter,setter来提供对外访问,可是kotlin bean确没有。于是你开始尝试对data class扩充,并且发现。。如果设置了private 就不能提供getter,setter了。
如果你有疑问,请继续看下去。唯一看透真相的是外表看似大人,但大脑萎缩只有儿童智商的名侦探wing!
线索
大家都知道。。kotlin是运行在jvm的语言,所以理所当然的,他是遵循jvm虚拟机规范的,也就是说生成的都是class文件,所以我们可以反编译class为java语言,那他与java做个对比。就可以明确的得到我们想要的答案。
首先建立一个kt文件,键入如下内容:
class User(){ public var name:String = "hah"}
- 1
- 2
- 3
- 1
- 2
- 3
明显这是一个User类,他具有一个String成员name,这时候在命令行使用kot
linc编译:
kotlinc user.kt
- 1
- 1
得到一个class文件,将class用JD_GUI打开可以得到如下代码:
public final class User{ @NotNull private String name = "hah"; @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String <set-?>) { Intrinsics.checkParameterIsNotNull(<set-?>, "<set-?>"); this.name = <set-?>; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
诺,真相大白了,事实说明在kotlin中,不需要private并且通过getter与setter,因为由以上结论得出kotlin中的public等价于java中private + getter + setter!!!
嗯哼?这下有没有解决你的疑虑?我们可以顺便看看伴生对象是如何实现的。
class User(){public var name:String = "hah"companion object{ fun getName():String{ return "name"}}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
反编译以后,与user.class同级目录下会多处一个User$Companion.class的文件,他就是user的伴生对象了,查看对应java代码如下:
public final class User$Companion{ @NotNull public final String getName() { return "name"; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
看到其实伴生对象并不是static实现的,所以说跟static还是有区别的,既然是object 那么应该就不是class ,或者说这个class只有一个实例,可以说另一种奇葩的单利模式吧。总之这个对象会跟随user生,跟随user死,然后她有一个实例,提供了一个方法。目前我的理解是这样的,如有错误,欢迎指出~~
本文这就结束了(嫌文字太短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))
如果你是Android开发者,那么你还可以来 wing的酒馆:425983695来分享你的开发经验哦
一个使用Kotlin开发的完整项目地址
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程
- 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean
- 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean
- 让你的代码量减少3倍!使用kotlin开发Android(一)
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
- 让你的代码量减少3倍!使用kotlin开发Android(一)
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- 让你的 Kotlin 代码远离 !!
- 让你的 Kotlin 代码远离 !!
- kotlin-for-android简介 (让你的Android代码更简洁)
- 使用Kotlin开发Android遇到的问题
- 使用Kotlin优雅的开发Android应用
- 使用Kotlin优雅的开发Android应用
- 使用 kotlin 开发 android 遇到的问题
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- Ogre传入数组到cg程序中
- java代码执行字符串中的逻辑运算
- 自定义View Measure过程
- iOS 自定义双向滑块Slider
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
- 畅通工程
- 浏览器原理及优化
- Anaconda 3 4.2.0上 安装geopandas
- Android Glide You cannot start a load for a destroyed activity 的异常及解决方法
- 在WIN10的linux子系统是存放在硬盘的哪里?
- 阿里MQ使用经验
- Android之自定义EditText光标和下划线颜色
- JUnit单元测试