record 替代 lombok, 我觉得不行
record 怎么用 🚒...
- record
- 可替代 lombok 否?
- 提供setter方法吗?
- 算浅拷贝吗?
- 总结
你要适应我 坚定我 我才能发挥我百分百的甜
record
record是Java 14中引入的一个新特性,它是一种类似于类的结构,但用于表示不可变数据。相比于传统的Java类,record在定义数据类时更为简洁、易读和易用。
record通常用于表示一些轻量级的数据类型,如DTO(数据传输对象)、VO(值对象)、POJO(简单Java对象)等。record的定义方式类似于类,但使用关键字“record”代替了“class”,并可以使用“final”关键字来保证实例的不可变性。
下面是一个简单的record的例子:
record Person(String name, int age) {}
上面这个record定义了一个名为Person的数据类,它有两个属性:name和age。通过这个定义,我们可以很方便地创建一个Person对象:
Person person = new Person("Tom", 20);
可以看到,创建Person对象的方式和创建普通Java对象的方式非常相似。但是,与普通Java对象不同的是,我们不能直接修改record对象的属性值。如果想要修改对象的属性,我们需要创建一个新的对象。
此外,record还提供了一些其他的有用特性,例如自动实现equals()、hashCode()和toString()方法等。在实际开发中,使用record可以帮助我们更好地组织代码,提高代码的可读性和可维护性。
可替代 lombok 否?
使用record可以让我们避免手写getter和setter方法。实际上,record可以自动为每个属性生成对应的getter方法,这些方法可以通过属性名直接调用,如person.name()
。而且,record还可以自动生成equals()、hashCode()和toString()等方法的实现,这些方法通常需要我们手动编写。
提供setter方法吗?
record是一种不可变的数据类,因此它并没有提供默认的setter方法。如果我们需要修改record对象的属性值,我们需要创建一个新的对象。比如,我们可以通过使用withXxx()方法来创建一个新的record对象,该方法会返回一个新的对象,同时修改指定的属性值,例如:
record Person(String name, int age) {}
Person person = new Person("Tom", 20);
Person newPerson = person.withAge(21); // 创建一个新的Person对象,同时修改年龄属性为21
在上面的例子中,我们通过withAge()方法来创建一个新的Person对象,同时修改年龄属性为21。这个新的Person对象与原来的对象不同,它是一个全新的对象,原来的对象并没有被修改。需要注意的是,withXxx()方法并不是在原来的对象上进行修改,而是创建一个新的对象,因此record仍然是不可变的。
算浅拷贝吗?
算
如果在record的构造函数中使用了另一个类的对象,那么在调用withXxx()
方法修改属性时,会复制该对象的引用。这种情况下,withXxx()
方法的行为就类似于浅拷贝。也就是说,新对象和原对象共享同一个引用类型属性的值,修改其中一个对象的该属性值也会影响到另一个对象。这是因为在Java中,对象之间的赋值是基于引用的,复制引用类型属性的时候,只是复制了对象的地址,而不是对象本身。
需要注意的是,即使在record的构造函数中使用了另一个类的对象,record本身仍然是不可变的。也就是说,修改record对象的属性值仍然需要创建一个新的对象,同时复制原对象的属性值并修改指定的属性值。只不过,如果原对象包含引用类型的属性,修改该属性值时需要注意共享对象的情况。
总结
相比于传统的Java类,使用record可以让我们更加专注于数据本身,而不是getter和setter方法的实现。同时,它还可以减少代码的冗余,提高代码的可读性和可维护性。值得注意的是,虽然record提供了许多便利的功能,但并不适用于所有的情况,有些情况下我们仍需要手写Java类和对应的方法。