JAVA - 记录

有时,数据就是数据,而面向对象程序设计提供的数据隐藏有些碍事,考虑一个类,这个类描述平面上的一个点,有下x和y坐标

package com.demo;

public class Ponint {
    private final double x;
    private final double y;

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


    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
    @Override
    public String toString() {
        return "Ponint{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

}

这里隐藏了x和y,然后通过获取方法获取这些值,这种做法确实对我们有好处吗?我们将来想改变Point类的实现吗? 为了更简洁的定义这些类,JDK14 引入了一个预览特性:"记录",最终在JDK版本16中发布

记录(record) 是一种特殊形式的类,其状态不可变, 而且公共可读,可以如下将Point 定义为一个记录

public record Point(double x, double y) {
}

其结果是有以下实例字段的类:
private final double x;
private final double y;

在Java语言规范中,一个记录的实例字段称为组件(component)
这个类有一个构造器:
point(double x, double y)
和以下访问器方法:
public double x()
public double y()

public record Point(double x, double y) {

    public static void main(String[] args) {
        Point point = new Point(3, 2);
        System.out.println(point.x() + "  " + + point.y());  //3.0  2.0
    }
}

构造器分为:标准、自定义、简洁

标准构造器:自动定义地设置所有实例字段的构造器称为标准构造器

自定义构造器:

/*
1.这种构造器的第一个语句必须调用另外一个构造器,所以最终会调用标准构造器
2.这个记录有两个构造器:标准构造器和一个生成原点的无参数构造器
*/
public record Point(double x, double y) {
    public Point(){
        this(0,0);
    }
}

如果标准构造器需要完成额外的工作,那么可以提供你自己的实现:

public record Range(int from ,int to) {
    
    public Range(int from,int to){
        if (from <= to){
            this.from = from;
            this.to = to;
        }else{
            this.from = to;
            this.to = from;
        }
    }

不过,实现标准构造器时,建议使用一种简洁(compact)形式,不用指定参数列表:

record Range(int from, int to) {

    public Range {
        if (from > to) {
            int temp = from;
            from = to;
            to = temp;
        }
    }
}

简洁形式的主体是标准构造器的“前奏”。它只是为实例字段this.from和this.to赋值之前修改变量from和to。不能在简洁构造器的主体中读取或修改实例字段

以下写法也会产生错误的结果:

posted @ 2023-10-15 21:15  chuangzhou  阅读(11)  评论(0编辑  收藏  举报