Java | 4.7记录的代码解析 | Java核心技术卷Ⅰ(第12版) 第四章 P137页 程序清单4-6 | 学习经验

一、代码展示

import java.util.*;

/**
 * This program demonstrates records.
 * @version 1.0 2021-05-13
 * @author Cay Horstmann
 */

public class RecordTest
{
   public static void main(String[] args)
   {
      var p = new Point(3, 4);                                                         //创建一个Point记录对象
      System.out.println("Coordinates of p: " + p.x() + " " + p.y());                  //记录对象中自带来两个读取函数。输出结果为Coordinates of p:3 4
      System.out.println("Distance from origin: " + p.distanceFromOrigin());           //计算Math.hypot(3,4)。输出结果为:Distance from origin:5

      //Same computation with static field and method(使用static field和method进行相同的计算)
      System.out.println("Distance from origin: " + Point.distance(Point.ORIGIN, p));  //调用静态方法并使用静态实例字段,这个静态实例字段在初始化的时候,因为没用参数,所以将会调用Point()构造器,在这个构造器中会使用另一个构造器Point(0,0)。最后的输出结果为Distance from origin:5

      //A mutable record(可变记录)
      var pt = new PointInTime(3, 4, new Date());
      System.out.println("Before: " + pt);
      pt.when().setTime(0);
      System.out.println("After: " + pt);

      // Invoking a compact constructor(调用简洁构造函数)

      var r = new Range(4, 3);
      System.out.println("r: " + r);
   }
}

record Point(double x, double y)
{
   //A custom constructor(自定义构造函数)
   public Point() { this(0, 0); }           //这个this(0,0)构造器是所用记录自动生成的,想要理解可以看关于记录的文章
   //A method(方法)
   public double distanceFromOrigin()
   {
      return Math.hypot(x, y);
   }   
   //A static field and method(静态字段和静态方法)
   public static Point ORIGIN = new Point();
   public static double distance(Point p, Point q)
   {
      return Math.hypot(p.x - q.x, p.y - q.y);
   }
}

record PointInTime(double x, double y, Date when) { }

record Range(int from, int to)
{
   // A compact constructor(简洁构造器)
   public Range
   {
      if (from > to) // Swap the bounds(交换)
      {
         int temp = from;
         from = to;
         to = temp;
      }
   }
}

二、代码分析 

(1)Point记录详解(hypot方法会在下面放上解释链接):

      ①构造器:在Point记录中有两个构造器,分别为Point(double x,double y)和Point()。其中第一个带两个参数的构造器是记录类自动生成无需自己手动输入,在这个构造器中我们会将参数x和y分别赋值给类中的x和y实例字段,其等价代码为

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

另外一个构造器 Point(),它是一个调用Point(0,0)构造器的构造器。你可以理解为,这个构造器会帮助那些在使用构造器时没有输入任何参数的声明生成一个Point(0,0)的方法。下面我会通过伪代码展示原理

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

在Point记录中 ,声明ORIGIN这个静态实例字段的时候使用了Point()构造器。

(2)PointTime记录详解:

      ①构造器:只有一个标准构造器,其等价代码为

public Point( double x, double y, Date when){
        this.x = x;
        this.y = y;
        this.when = when;
}

(3)Range记录详解:

      ①构造器:这个记录使用了简洁形式,这个形式没有参数列表,它的本质上就是将原本有些长的代码简化,并且在这个简洁构造器中它只是对参数变量进行操作,不能对实例字段进行修改和读取。所以这个记录会先执行简洁构造器从而交换参数,之后会执行自动生成的标准构造器。

你可能感兴趣的:(Java核心技术,学习经验分享,java,学习,开发语言)