让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
上一篇我们介绍了缩短五倍的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;
}
data class User(var name: String, var id: String)
可以发现,代码是少了,但是好像不太一样,为什么呢? 可能很多人会有这样的疑问,在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"
}
明显这是一个User类,他具有一个String成员name,这时候在命令行使用kot
linc编译:
kotlinc user.kt
得到一个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-?>;
}
}
诺,真相大白了,事实说明在kotlin中,不需要private并且通过getter与setter,因为由以上结论得出kotlin中的public等价于java中private + getter + setter!!!
嗯哼?这下有没有解决你的疑虑?我们可以顺便看看伴生对象是如何实现的。
class User(){
public var name:String = "hah"
companion object{
fun getName():String{
return "name"
}
}
}
反编译以后,与user.class同级目录下会多处一个User$Companion.class的文件,他就是user的伴生对象了,查看对应java代码如下:
public final class User$Companion
{
@NotNull
public final String getName()
{
return "name";
}
}
看到其实伴生对象并不是static实现的,所以说跟static还是有区别的,既然是object 那么应该就不是class ,或者说这个class只有一个实例,可以说另一种奇葩的单利模式吧。总之这个对象会跟随user生,跟随user死,然后她有一个实例,提供了一个方法。目前我的理解是这样的,如有错误,欢迎指出~~
本文这就结束了(嫌文字太短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))
如果你是Android开发者,那么你还可以来 wing的酒馆:425983695来分享你的开发经验哦
让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密的更多相关文章
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean
回顾一下 哈,没想到你已经坚持不懈看到第三篇了,不错哈~坚持就是胜利. 本文同步自博主的私人博客wing的地方酒馆 在上一篇文章中,我们介绍了扩展函数,这里对上一篇进行一点小小的补充. 还记得text ...
- 让你的代码量减少3倍!使用kotlin开发Android
(一) 创建Kotlin工程 (二) –秘笈!扩展函数 (三) 缩短五倍的Java Bean 本项目使用的代码地址
- 想减少代码量,快设置一个有感知的 Aware Spring Bean
摘要:正常情况下,Spring 中的 Bean 对 Spring 是无感知的,Spring 框架提供了这种扩展能力,能让一个 bean 成为有感知的. 本文分享自华为云社区<有感知的 Aware ...
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
本文同步自 博主的私人博客wing的地方酒馆 在前面的博客中,有一个栗子,是点击按钮转跳的监听器. button.setOnClickListener { val user = User(" ...
- Guava中这些Map的骚操作,让我的代码量减少了50%
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合.缓存.并发.I/O等多个方面.使用这些API一方面 ...
- 前端程序员的蜕变——JS的 event 对象属性、使用实例、兼容性处理(极大提高代码效率、减少代码量)
下面讨论一下 js 中的 Event 对象,主要从以下三个方面详细的描述(点击标题可跳转到对应部分): 1.什么是event 2.怎么用event,用他该注意什么,几个简单实际应用 3.event在不 ...
- WPF INotifyPropertyChanged 通过特性减少代码量
在很多地方需要用上INotifyPropertyChanged的接口,MVVM模式,List等集合都会用到. 通常我们使用 protected void OnChange(PropertyChange ...
随机推荐
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- jacascript DOM节点——元素节点、属性节点、文本节点
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! DOM节点的三个种类:元素节点.文本节点.属性节点: 元素节点 元素节点就是 HTML 标签元素,元素节点 ...
- 20180117MySQL出现Waiting for table metadata lock的原因以及解决方法
转自http://www.cnblogs.com/digdeep/p/4892953.html 转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) ...
- Opencv在mac系统的安装与试用
1.在mac终端内,使用brew安装opencv3,这时我的opencv被安装到/usr/local/Cellar/opencv3/3.2.0内. 2.新建xcode 项目,选择command lin ...
- 同步IO,异步IO,阻塞IO,非阻塞IO
同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, 其实 ...
- [HNOI2012]双十字
题目描述 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的”1“线段组成,要求满足以下几个限制: ![] 我们可以找到 5 个满足条件的双十字,分别如下 ...
- ●BZOJ 2555 SubString
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2555题解: 后缀自动机+LCT 不难发现,对于输入的询问串,在自动机里trans后的到的状态 ...
- hdu 5119(2014北京)
题意: 随机选择一个数,如果后面有比他小的就进行交换,直到没有为止(算一轮).求多少轮后为递增序列 思路: 倒着找,如果有比经过的最小数大的,ans+1 #include <iostream&g ...
- 【集训第二天·翻水的老师】--ac自动机+splay树
今天是第二天集训.(其实已经是第三天了,只是昨天并没有机会来写总结,现在补上) 上午大家心情都很愉快,因为老师讲了splay树和ac自动机. 但到了下午,我们的教练竟然跑出去耍了(excuse me? ...
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...