Kotlin object

Kotlin object

Kotlin 中的object是个非常神奇的关键字,他可以干很多事情:

文章目录

1、匿名内部类

Java中我们这样写:

view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

或者:

 Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

Kotlin中这样写

view.setOnClickListener(object :View.OnClickListener{
            override fun onClick(v: View?) {
                
            }
        })
val handler = object : Handler(){
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
        }
    }

2、单例模式

object Single {
    fun add(){}
}

上面就是Kotlin的单例模式了,调用:
Java:

Single.INSTANCE.add();

Kotlin:

 Single.add()

这里需要注意的是Java中调用的时候加了一个 INSTANCE 。
下面我们看看编译成Java代码Single是如果实现的,如果不知道如何将Kotlin代码变为Java代码请看: 。

在这里插入图片描述


我们发现这是典型的饿汉式单例模式。这种单例模式在类加载的时候就进行了实例化,没有懒加载机制,如果项目没有用到这个类就会造成内存浪费。

3、类内部的静态类

class ObjectDemo {
    object Demo1{
        fun add(){}
    }
}

Demo1是静态内部类,对应的Java:


public final class ObjectDemo {
 
   public static final class Demo1 {
      public static final ObjectDemo.Demo1 INSTANCE;

      public final void add() {
      }

      static {
         ObjectDemo.Demo1 var0 = new ObjectDemo.Demo1();
         INSTANCE = var0;
      }
   }
}

4、companion object

class ObjectDemo {


    fun test(){
        add()
        var s= name
    }

    companion object {
        val name = ""
        fun add(){}
    }

}

转为Java:

public final class ObjectDemo {
   @NotNull
   private static final String name = "";
   public static final ObjectDemo.Companion Companion = new ObjectDemo.Companion((DefaultConstructorMarker)null);

   public final void test() {
      Companion.add();
      String s = name;
   }
   public static final class Companion {
      @NotNull
      public final String getName() {
         return ObjectDemo.name;
      }

      public final void add() {
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }

我们发现其实就是在类内部生成了一个静态类 Companion,由于Kotlin中没有static关键字,所以定义静态属性的时候使用companion object,如下:

companion object {
        const val TAG = "ObjectDemo"
    }