Kotlin 极简教程(9)- 数据类

数据类是一种非常强大的类,可以避免重复创建 Java 中的用于保存状态但又操作非常简单的 POJO 的模版代码,它们通常只提供了用于访问它们属性的简单的 getter 和 setter

定义一个新的数据类非常简单,例如

data class Point(val x: Int, val y: Int)

数据类默认地为开发者重载了几个方法,包括 getter、setter(需要是 var)、componentN()、copy() 、toString()、hashCode()、equals()等方法
可以利用 IDEA 来反编译查看 Point 类的 Java 实现,了解其内部实现

public final class Point {
   private final int x;
   private final int y;

   public final int getX() {
      return this.x;
   }

   public final int getY() {
      return this.y;
   }

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }

   public final int component1() {
      return this.x;
   }

   public final int component2() {
      return this.y;
   }

   @NotNull
   public final Point copy(int x, int y) {
      return new Point(x, y);
   }

   // $FF: synthetic method
   // $FF: bridge method
   @NotNull
   public static Point copy$default(Point var0, int var1, int var2, int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var1 = var0.x;
      }

      if ((var3 & 2) != 0) {
         var2 = var0.y;
      }

      return var0.copy(var1, var2);
   }

   public String toString() {
      return "Point(x=" + this.x + ", y=" + this.y + ")";
   }

   public int hashCode() {
      return this.x * 31 + this.y;
   }

   public boolean equals(Object var1) {
      if (this != var1) {
         if (var1 instanceof Point) {
            Point var2 = (Point)var1;
            if (this.x == var2.x && this.y == var2.y) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}

通过数据类,简化了很多的通用操作,可以很方便地进行:格式化输出变量值、映射对象到变量、对比变量之间的相等性、复制变量等操作

fun main(args: Array<String>) {
    val point1 = Point(10, 20)
    val point2 = Point(10, 20)
    println("point1 toString() : $point1")
    println("point2 toString() : $point2")

    println()
    val (x, y) = point1
    println("point1 x is $x,point1 y is $y")

    println()
    //在 kotlin 中,“ == ” 相当于 Java 的 equals 方法
    //而 “ === ” 相当于 Java 的 “ == ” 方法
    println("point1 == point2 : ${point1 == point2}")
    println("point1 === point2 : ${point1 === point2}")

    println()
    val point3 = point1.copy(y = 30)
    println("point3 toString() : $point3")
}

猜你喜欢

转载自blog.csdn.net/new_one_object/article/details/80042289