@data重写set⽅法_你还在Java代码中写setget⽅法?别告诉
我你还没⽤过Lombok
推荐阅读:
⼀只Tom猫:玩转JAVA筑基之Netty、并发编程与设计模式,打好基础备战春招!z huanlan.zhihu
前⾔
what?你的 Java 代码中还充斥着⼤量的 set/get ⽅法?
我们在刚开始学习 Java 语⾔的时候讲过,⾯向对象的三⼤特征就是封装,继承,和多态。在 Java 中,要保证封装性,需要将成员变量私有化,对外提供 set/get ⽅法来访问,虽然现在的 IDE,像 eclipse,IDEA都提供了快捷键,来⽣成 set/get ⽅法,但是在做项⽬的时候,⼀个 JavaBean 往往会有很多的成员变量,⼀个变量对应两个⽅法,如果有10⼏个成员变量,那么会对应20多个⽅法,也许还要去写构造器、equals 等⽅法,⽽且需要维护。这样⼀来,会使代码变得⾮常冗余,这些显得很冗长也没有太多技术含量,⼀旦修改属性,就容易出现忘记修改对应⽅法的失误。
我在看⼤佬的项⽬的源码的时候,看到他们的代码中都没有 set/get ⽅法,取⽽代之的是在 JavaBean 上标注的注解,我感到⾮常的好奇,原来他们是⽤了⼀种叫做 Lombok 的插件,便去详细了解了这个插件。
Lombok背景介绍
官⽅介绍如下:
Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.
⼤致意思是 Lombok 通过增加⼀些“处理程序”,可以让 Java 变得简洁、快速。
java的tostring方法Lombok使⽤⽅法
Lombok 能通过注解的⽅式,在编译时⾃动为属性⽣成构造器、getter/setter、equals、hashcode、toString ⽅法。出现的神奇就是在
源码中没有 getter 和 setter ⽅法,但是在编译⽣成的字节码⽂件中有 getter 和 setter ⽅法。这样就省去了⼿动重建这些代码的⿇烦,使代码看起来更简洁些。
<dependency>  <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.10</version>    <scope>provided</scope></depe 注意:
第⼀次使⽤ Lombok 插件需要做如下⼏步配置
将 Lombok 插件安装到 IDEA
file -> setting
选中 Plugins,搜索 Lombok,点击 Install
选择默认的编译⽅式为 javac,因为 eclipse 是不⽀持 Lombok 的编译⽅式的,javac ⽀持 Lombok 的编译⽅式。
打开注解⽣成器 Enable annotation processing
再次注意:
IntelliJ IDEA 2019.2(也就是我⽤的版本)默认是不⽀持 Lombok 插件的,需要去
plugins.jetbrains/plugin/6317-lombok/versions
下载对应版本的插件,然后⼿动引⼊,在 IDEA 中选择 File -> Setting -> plugins 到 Install Plugin from Disk…(注意版本不同位置可能有所差异)
接下来我们来分析 Lombok 中注解的具体⽤法
@Data
@Data 注解在类上,会为类的所有属性⾃动⽣成 setter/getter、equals、canEqual、hashCode、toString ⽅法,如为 final 属性,则
不会为该属性⽣成 setter ⽅法。
⽐如我们写⼀个学⽣类
@Datapublic class Student {    private String name;    private Integer age;    private Integer id;    private String major;}
这样就可以调⽤ set/get ⽅法了。
@Getter/@Setter
如果觉得@Data 太过残暴(因为@Data 集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、
@RequiredArgsConstructor 的所有特性)不够精细,可以使⽤@Getter/@Setter 注解,此注解在属性上,可以为相应的属性⾃动⽣成set/get ⽅法。
public class Student {  @Setter private String name;    private Integer age;    private Integer id;    private String major;    public static void main(String[] args @NonNull
该注解⽤在属性或构造器上,Lombok 会⽣成⼀个⾮空的声明,可⽤于校验参数,能帮助避免空指针。
public class Student {  @Setter private String name;    private Integer age;    private Integer id;    private String major;        public Student(@NonNull String @Cleanup
该注解能帮助我们⾃动调⽤ close() ⽅法,很⼤的简化了代码。
public class CleanupExample {  public static void main(String[] args) throws IOException {@Cleanup InputStream in = new FileInputStream(args[0]);@Clea @EqualsAndHashCode
默认情况下,会使⽤所有⾮静态(non-static)和⾮瞬态(non-transient)属性来⽣成 equals 和 hashCode,也能通过 exclude 注解来排除⼀些属性。
@EqualsAndHashCode(exclude={"id", "shape"})public class EqualsAndHashCodeExample {    private transient int transientVar = 10;    private String name @ToString
类使⽤@ToString 注解,Lombok 会⽣成⼀个 toString() ⽅法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),⽤逗号来分割。
通过将 includeFieldNames 参数设为 true,就能明确的输出 toString() 属性。这⼀点是不是有点绕⼝,通过代码来看会更清晰些。
@ToString(exclude="id")public class ToStringExample {    private static final int STATIC_VAR = 10;    private String name;    private Shape shape = new Sq @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
⽆参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。
@RequiredArgsConstructor(staticName = "of")@AllArgsConstructor(access = AccessLevel.PROTECTED)public class ConstructorExample<T> {    private int x, y;
作者:Mr.ml
原⽂链接: blog.csdn/MarcoAsen sio/article/details/103654691

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。