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。不能在简洁构造器的主体中读取或修改实例字段
以下写法也会产生错误的结果:
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/17766214.html