让你的代码量减小3倍!使用kotlin开发Android(四) kotlin bean背后的秘密

上一篇咱们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏?javascript

本文同步自博主的私人博客wing的地方酒馆php

再来回顾一下,两种代码的对比java

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了。android

若是你有疑问,请继续看下去。惟一看透真相的是外表看似大人,但大脑萎缩只有儿童智商的名侦探wing!
git

名侦探wing

线索

你们都知道。。kotlin是运行在jvm的语言,因此理所固然的,他是遵循jvm虚拟机规范的,也就是说生成的都是class文件,因此咱们能够反编译class为java语言,那他与java作个对比。就能够明确的获得咱们想要的答案。github

首先创建一个kt文件,键入以下内容:jvm

class User(){
    public var name:String = "hah"
}复制代码

明显这是一个User类,他具备一个String成员name,这时候在命令行使用kot
linc编译:this

kotlinc user.kt复制代码

获得一个class文件,将class用JD_GUI打开能够获得以下代码:spa

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!!!.net

嗯哼?这下有没有解决你的疑虑?咱们能够顺便看看伴生对象是如何实现的。

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死,而后她有一个实例,提供了一个方法。目前个人理解是这样的,若有错误,欢迎指出~~

本文这就结束了(嫌文字过短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))

欢迎加入Kotlin小乐园群(这是一个高质量、优秀的圈子):479109923

若是你是Android开发者,那么你还能够来 wing的酒馆:425983695来分享你的开发经验哦

一个使用Kotlin开发的完整项目地址

相关文章
相关标签/搜索