美文网首页kotlin
apply{}和kotlin中的代码块

apply{}和kotlin中的代码块

作者: ukyoo | 来源:发表于2018-12-24 20:34 被阅读0次

    构造对象的时候免不了要进行一些初始化的操作,我们可以使用java提供的构造代码块
    使用kotlin后,我们多了别的选择
    Standard.kt是kotlin封装好的一个工具类,其中的apply方法为
    fun T.apply(block: T.() -> Unit): T { block(); return this }
    可以看到返回值返回的是对象本身,很适合对象的初始化操作

    htmlService.login(HashMap<String,String>().apply {
         put("1","1")
    })
    

    通过AndroidStudio自带的show kotlin byteCode可以查看编译后的.class文件,
    方法: Tools ->Koltin -> Show Kotlin ByteCode,点击插件GUI的Decompile

    反编译后的文件,可以看到

    public final void login() {
          HtmlService var10000 = this.htmlService;
          HashMap var1 = new HashMap();
          HtmlService var4 = var10000;
          var1.put("1", "1");
          var4.login((Map)var1);
       }
    
       public final void login1() {
          this.htmlService.login((Map)(new HashMap() {
             {
                this.put("1", "1");
             }
    
             // $FF: bridge method
             public boolean containsValue(String var1) {
                return super.containsValue(var1);
             }
    
             // $FF: bridge method
             public final boolean containsValue(Object var1) {
                return var1 instanceof String ? this.containsValue((String)var1) : false;
             }
    
             // $FF: bridge method
             public String getOrDefault(String var1, String var2) {
                return (String)super.getOrDefault(var1, var2);
             }
    
             // $FF: bridge method
             public final Object getOrDefault(Object var1, Object var2) {
                return var1 instanceof String ? this.getOrDefault((String)var1, (String)var2) : var2;
             }
    
             // $FF: bridge method
             public boolean containsKey(String var1) {
                return super.containsKey(var1);
             }
    
             // $FF: bridge method
             public final boolean containsKey(Object var1) {
                return var1 instanceof String ? this.containsKey((String)var1) : false;
             }
            ........
          }));
       }
    
    

    当然java中的静态代码块,构造代码块,方法代码块在kotlin中也是可以使用的

    构造代码块

    • 先看java中的构造代码块,这里的例子是一个匿名内部类的构造方法
        void login() {
            new HashMap<String, String>() {
                {
                    put("1", "1");
                }
            };
        }
    
    • kotlin中需要加上init{ }来标识
    htmlService.login(object : HashMap<String, String>() {
         init {
             put("1", "1")
         }
    })
    

    静态代码块

    • java中的静态代码块不多做说明
    • kotlin是没有static的,这里想到的肯定是伴生对象
      //java代码
      static{
         int aa =1;
      }
    
      //kotlin代码
      companion object {   //kotlin的静态代码块
          init{
    
          }
      }
    

    方法代码块

    • java中的方法代码块不多做说明
    • kotlin中的方法代码块,由于和kotlin中lambda简写的{ }冲突,系统会提示我们使用Standard.kt中的run{ }方法
      image.png
       //java
       void test(){
            {
                int a = 1;
            }
            a = 2;  //报错
        }
    
        //kotlin
        fun test(){
            run {
                var a =1
            }
            a =2  //报错
        }
    

    和java中的{}一样,括号中声明的变量作用域仅限于括号内

    相关文章

      网友评论

        本文标题:apply{}和kotlin中的代码块

        本文链接:https://www.haomeiwen.com/subject/bcizkqtx.html