Java
以前定义类都是用class关键词,但从Java 16开始,将多一个关键词record,它也可以用来定义类。
这个record关键词的引入,主要是为了提供一种更为简洁、紧凑的final类的定义方式。下面就来具体了解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;}@Overridepublic 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;}@Overridepublic int hashCode() {return Objects.hash(start, end);}@Overridepublic String toString() {return "range{" +"start=" + x +", end=" + y +'}';}public int start(){return start;}public int end(){return end;}}
因为一些函数是隐藏的,在range定义的时候,看不到,所以可以尝试写这样一段测试代码来验证一下:
@Testpublic 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();
