• 让你的代码量减少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!
    名侦探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来分享你的开发经验哦

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

  • 相关阅读:
    如何提高360评估的问卷回收率?
    ArcGIS工具 统计要素数量
    ArcGIS工具 导出空数据库
    ArcEngine开发 打开地图读取图层
    ArcGIS工具 按要素裁切数据库
    ArcGIS工具 批量删除空图层
    ArcGIS工具 导出数据库结构
    ArcGIS Python判断数据是否存在
    不能远程登录虚拟机的问题,linux环境下网卡重启
    IDEA安装
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333505.html
Copyright © 2020-2023  润新知