前言

  在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便,其实,我们还有更方便的办法,那就是-Lombok:非常强大的POJO注解器。

Lombok是什么?

  lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO。

如何安装Lombok?

  使用 lombok 是需要安装的,如果不安装,IDE 则无法解析 lombok 注解。先在官网下载最新版本的 JAR 包

  1. 双击下载下来的 JAR 包安装 lombok;
    我选择这种方式安装的时候提示没有发现任何 IDE,所以我没安装成功,我是手动安装的。
  2. eclipse / myeclipse 手动安装 lombok(Mac 下eclipse安装Lombok插件
    1. 将 lombok.jar 复制到 myeclipse.ini / eclipse.ini 所在的文件夹目录下
    2. 打开 eclipse.ini / myeclipse.ini,在最后面插入以下两行并保存: 
      -Xbootclasspath/a:lombok.jar
      -javaagent:lombok.jar
    3. 重启 eclipse / myeclipse

Lombok使用详解

  • 添加POM依赖:

    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
    </dependency>
  • Lombok提供注解方式来提高代码的简洁性,常用注解概览:

    • @Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法,相当于同时加上以下注解@Setter @Getter,@ToString,@EqualsAndHashCode
    • @Setter、@Getter:注解在类和属性上;为属性提供 setting、getting 方法
    • @ToString:生成toString方法,默认情况下,会输出类名、所有属性,属性按照顺序输出,以逗号分割。
    • @EqualsAndHashCode:实现equals()方法和hashCode()方法
    • @Builder:构建 建造者模式
    • @NonNull:该注解快速判断是否为空,如果为空,则抛出java.lang.NullPointerException
    • @Synchronized:该注解自动添加到同步机制,有趣的是,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
    • @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
    • @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
    • @RequiredArgsConstructor:注解在类上;为类提供一个部分参的构造方法(使用类中所有带有@NonNull注解的或者带有final修饰的成员变量生成对应的构造方法)
    • @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
    • @Cleanup:用于确保已分配的资源被释放,如IO的连接关闭
    • @SneakyThrows:抛异常
    • @Accessors(chain = true):使用链式结构

@Data

  注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法,相当于同时加上以下注解@Setter @Getter,@ToString,@EqualsAndHashCode

 @Data
public class Person {
private String name;
private String address;
private String city;
private String state;
private String zip;
private Date brithday;
}

效果如下:

@Getter@Setter

  注解在类和属性上;为属性提供 setting、getting 方法

public class Person {
@Getter@Setter
private String name;
}

  等价源码:

 public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}

@ToString

生成toString方法,默认情况下,会输出类名、所有属性,属性按照顺序输出,以逗号分割。但需要注意的是:@ToString有多个属性可以进一步设置:

    • callSuper 是否输出父类的toString方法,默认为false

    • includeFieldNames 是否包含字段名称,默认为true

    • exclude 排除生成tostring的字段

      使用方法:

       @ToString(callSuper = true,exclude ={"name"})
      public class Person {
      private String name;
      private String address;
      }

      等价源码:

       public String toString() {
      return "Person{" +
      "address='" + address + '\'' +
      '}';
      }

@NonNull

该注解快速判断是否为空,如果为空,则抛出java.lang.NullPointerException
  使用方法

 public class Person {

     private String name;

     @Setter@Getter@NonNull
private List<Person> member;
}

  等价源码:

 @NonNull
private List<Person> members; public Family(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
} @NonNull
public List<Person> getMembers() {
return members;
} public void setMembers(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
}

@Synchronized

该注解自动添加到同步机制,有趣的是,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上。
使用方法:

 private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");

 @Synchronized
public String synchronizedFormat(Date date) {
return format.format(date);
}

等价源码:

 private final java.lang.Object $lock = new java.lang.Object[0];
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); public String synchronizedFormat(Date date) {
synchronized ($lock) {
return format.format(date);
}
}

@Cleanup

注释可用于确保已分配的资源被释放,如IO的连接关闭。
使用方法:

 public void testCleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}

等价源码:

 public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

@Accessors(chain = true)

  使用链式结构

  • 使用方法:

    @Accessors(chain=true)
    public class Student {
    private String name;
    private int age; public String getName() {
    return name;
    } public Student setName(String name) {
    this.name = name;
    return this;
    } public int getAge() {
    return age;
    } public Student setAge(int age) {
    return this;
    }
    }
  • 等价源码:
     @Accessors(chain = true)
    @Data
    @NoArgsConstructor(staticName = "of")
    public class Student {
    private String name;
    private int age;
    }
  • 调用
     Student student = Student.of().setName("wsk").setAge(12);

@Builder

  使用builder,构建 建造者模式

  • 例一:

    • 使用@Builder

       @Builder
      public class Student {
      private String name;
      private int age;
      }
    • 调用示例:
       Student student = Student.builder().name("zs").age(24).build();
    • 等价源码:
       public class Student {
      private String name;
      private int age; public String getName() {
      return name;
      } public void setName(String name) {
      this.name = name;
      } public int getAge() {
      return age;
      } public void setAge(int age) {
      this.age = age;
      } public static Builder builder(){
      return new Builder();
      }
      public static class Builder{
      private String name;
      private int age;
      public Builder name(String name){
      this.name = name;
      return this;
      } public Builder age(int age){
      this.age = age;
      return this;
      } public Student build(){
      Student student = new Student();
      student.setAge(age);
      student.setName(name);
      return student;
      }
      }
      }
  • 例二:利用builder模式设计的Java类  
    • 如果能将创建JavaBean和设置内容揉在一起,在传入builder中的参数不合乎业务或者非法,那么就不能创建student对象,这时候可以通过捕获IllegalArgumentException,从而得知失败的原因;
    • 引入Builder设计模式以后,代码保持JavaBean好的可读性,但同时增强了安全性,将Student类的创建和设置内容揉在了一起,并增加了安全性检查,提高了系统的健壮性,同时防止了编码中的一些疏忽。
    • Java示例:
       public class Student {
      private String id;
      private String name;
      private String sex;
      private int age;
      private String department; public static class Builder {
      /*
      * 只能指定一次。
      */
      private final String id;
      private final String department; private String name = "";
      private String sex = "男";
      private int age = 20; /*
      * 非空属性,必须在构造器中指定。
      */
      public Builder(String id, String department) {
      this.id = id;
      this.department = department;
      } /*
      * name,sex,age可选择属性,提供特殊的setter方法。
      */
      public Builder name(String name) {
      this.name = name;
      return this;
      } public Builder sex(String sex) {
      this.sex = sex;
      return this;
      } public Builder age(int age) {
      this.age = age;
      return this;
      } /*
      * Student对象创建器,想得到一个Student对象必须使用build 方法,
      * 在方法中增加对Builder参数的验证,并以异常的形式告诉给开发人员。
      */
      public Student build() {
      /* 检查Builder对象中的数据是否合法。
      * 针对这个例子,就是检查主键冲突,外键制约等
      * 如果不满足我们可以抛出一个IllegalArgumentException
      */
      return new Student(this); } } private Student(Builder builder) {
      this.id = builder.id;
      this.name = builder.name;
      this.sex = builder.sex;
      this.age = builder.age;
      this.department = builder.department;
      } /*
      * 只提供getter方法
      */
      public String getId() {
      return id;
      } public String getName() {
      return name;
      } public String getSex() {
      return sex;
      } public int getAge() {
      return age;
      } public String getDepartment() {
      return department;
      } }
    • 创建对象一:
            student = new Student.Builder("03041013", "计算机").name("李华").build();
    • 创建对象二:
           Student.Builder builder = new Student.Builder("03041013", "计算机");
      builder.name("李华");
      Student student = builder.build();

小结:

  • 很明显,使用 lombok 要简洁许多,特别是在类的属性较多的情况下;
  • 同时也避免了修改字段名字时候忘记修改方法名所犯的低级错误;

参考资料

Lombok之使用详解的更多相关文章

  1. IDEA2017.3.4破解方式及lombok图文配置详解

    下载jetbrainsCrack-2.7-release-str.jar包 下载地址: https://files.cnblogs.com/files/xifenglou/JetBrains.zip ...

  2. Intellij IDEA 安装lombok及使用详解

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...

  3. 34.Intellij IDEA 安装lombok及使用详解

    转自:https://blog.csdn.net/qinxuefly/article/details/79159018 项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set ...

  4. Lombok的使用详解与插件安装

    JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...

  5. Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题

    原文:https://blog.csdn.net/f641385712/article/details/82081900 前言 Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一 ...

  6. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  7. Lombok使用详解(转)

    本文转自https://blog.csdn.net/u010695794/article/details/70441432 2017年04月22日 15:17:00 阅读数:10394 Lombok使 ...

  8. Lombok 使用详解,简化Java编程

    前言 在 Java 应用程序中存在许多重复相似的.生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求 比如,在 Java 应用程序开发中,我们几乎要为所有 ...

  9. Netty4.x整合SpringBoot2.x使用Protobuf3详解

    前言 本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容.Protobuf会介绍下用法,至于Netty在netty 之 telnet HelloWor ...

随机推荐

  1. python基础-->流程控制-->分支结构-->单项分支-->双向分支

    # ###流程控制 ''' 流程:代码执行过程 流程控制:对代码执行过程的管控 顺序结构:代码默认从上到下依次执行 分支结构:对代码执行过程的管控 循环机构: while for ..in.... 分 ...

  2. openssh-win64 on windows2016 ssh pub key config

    DO NOT follow the official M$ documentation at https://docs.microsoft.com/en-us/windows-server/admin ...

  3. 项目从.net core 2.1.0升级到.net core 2.2.4,原有项目出错及解决方案

    ... 1.Controller中的形参命名为query.pager,且里面实体中的参数也有Query.Pager参数时,Query.Pager 就会无数据. 解决方案: 形参query.pager ...

  4. Pycharm中Python3连接Oracle

    一.环境配置:系统:win7.10 (64位)软件:1.Python3.7.2 (64位)2.instantclient-basic-windows.x64-11.2.0.4.0.zip(64位) - ...

  5. java String补足

    regionMatches()方法: equals 比较内容  == 比较的是地址

  6. Qt QLineEdit 漂亮的搜索框 && 密码模式 && 格式化输入 && 提示文字 && 选择内容并移动 && 清除全部输入

    先上一个漂亮的搜索框效果图, 输入搜索文本效果, 点击搜索图标效果: //实现代码 void MainWindow::iniLineEdit() { ui->lineEdit->setPl ...

  7. CSRF原理

    全称跨站伪造

  8. Vue相关开源项目库汇总

    https://github.com/opendigg/awesome-github-vue http://www.opendigg.com/tags/front-vue README.md 内容 U ...

  9. 梳理vue双向绑定的实现原理

    Vue 采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后 ...

  10. Javascript学习-简单测试环境

    Javascript学习-简单测试环境 在<JavaScript忍者秘籍>2.4测试条件基础知识中,作者给出了一个精简版的assert和assert组的实现,对于初学者而言,这无疑是一个很 ...