Kotlin学习 - 数据类与单例类

数据类

在Java代码中,数据类通常需要重写equals()、hashCode()、toString()这几个方法。虽然有快捷方式可以自动生成,但是还是要我们去点击生成下,并且一个简单的数据类就算没有其他复杂逻辑看着也挺繁琐的,代码如下:

public class UserBean {
    private String name;
    private String pwd;
    
    public UserBean(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
     ...
     
    @Override
    public String toString() {
        return "UserBean{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
   
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserBean userBean = (UserBean) o;
        return name.equals(userBean.name) && pwd.equals(userBean.pwd);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(name, pwd);
    }

Kotlin中的数据类自动帮我们解决了这个问题,同样新建一个数据类,代码如下:

data class UserBean(var name: String, var pwd: String)

只需要一行代码就可以实现了!神奇的地方就在于data这个关键字,当在一个类前面声明了data关键字时,就表明你希望这个类是一个数据类,Kotlin会根据主构造函数中的参数帮你将equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成,从而大大减少了开发的工作量。

数据类使用:

fun main() {
    val user1 = UserBean("tom", "123")
    val user2 = UserBean("tom", "123")
    println(user1)
    println(user1 == user2)
}

//运行结果
//UserBean(name=tom, pwd=123)
//true

单例类

在Kotlin中创建一个单例类的方式极其简单,只需要将class关键字改成object关键字即可。代码如下:

object Singleton {
    fun test(){
        println("Singleton test!!")
    }
}

单例类的使用:

fun main() {
    Singleton.test()
}

看上去像是静态方法的调用,但其实Kotlin在背后自动帮我们创建了一个Singleton类的实例,并且保证全局只会存在一个Singleton实例。

反编译上面单例类:

public final class Singleton {
   @NotNull
   public static final Singleton INSTANCE;

   public final void test() {
      String var1 = "Singleton test!!";
      boolean var2 = false;
      System.out.println(var1);
   }

   private Singleton() {
   }

   static {
      Singleton var0 = new Singleton();
      INSTANCE = var0;
   }
}

在反编译main调用函数:

public static final void main() {
  Singleton.INSTANCE.test();
}

能看出实际调用的是单例中的实例Singleton.INSTANCE

通过数据类与单例类学习可以看出Kotlin对Java中的各种繁琐代码进行了优化,可以使程序员把更多精力放在业务逻辑上面,也简化了代码行数,减少了代码阅读量。

你可能感兴趣的:(kotlin,kotlin,学习,java)