以前咱们定义类都是用 class
关键词,但从 Java 16 开始,咱们将多一个关键词 record
,它也能够用来定义类。record
关键词的引入,次要是为了提供一种更为简洁、紧凑的 final
类的定义形式。
上面就来具体理解 record 类的细节。配套视频教程:Java 16 新个性:应用 record 申明类
申明 record 类
申明 record 类的根底语法:
record range(int start, int end){}
咱们晓得 class 类能够在独自文件中生命,也能够在其余类中申明。那么 record 类也一样,它有这几种申明形式:
- 独自文件申明:
public record range(int start, int end){}
- 在类外部申明:
public class DidispaceTest {public record range(int start, int end){}}
- 函数内申明:
public class DidispaceTest {public void test() {public record range(int start, int end){}}
}
record 类详解
在晓得了如何申明之后,你肯定会想用 record
申明的就那么点元素,它到底会具备什么能力呢?
因为 record
关键词申明类次要是为了简化一些类的申明,所以它实质就是一类非凡的 class,或者说是某一个模版的 class。
record
申明的类,具备这些特点:
- 它是一个
final
类 - 主动实现
equals
、hashCode
、toString
函数 - 成员变量均为
public
属性
所以,对于之前写的 range 类,它等价于一个这样的类:
public final class range{
final int start;
final int end;
public range(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object o) {if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
range range = (range) o;
return start == range.start && end == range.end;
}
@Override
public int hashCode() {return Objects.hash(start, end);
}
@Override
public String toString() {
return "range{" +
"start=" + x +
", end=" + y +
'}';
}
public int start(){return start;}
public int end(){return end;}
}
因为一些函数是暗藏的,在 range 定义的时候,咱们看不到,所以咱们能够尝试写这样一段测试代码来验证一下:
@Test
public void test() {range r = new range(100, 200);
log.info(r.toString());
range r2 = new range(100, 200);
log.info(String.valueOf(r.equals(r2)));
}
定义成员函数
因为 record
申明的实质也是类,那么定义成员函数必定也是能够的。
比方,咱们能够这样在 record
类中定义成员函数:
record range(int start, int end){int distance(){return end - start;}
}
而后,就能够这样调用它:
range r = new range(100, 200);
r.distance();
如果您学习过程中如遇艰难?能够退出咱们超高品质的技术交换群,参加交换与探讨,更好的学习与提高!另外,不要走开,关注我,继续更新 Java 新个性专栏!
欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源