前言

  在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. 【LeetCode每天一题】Minimum Path Sum(最短路径和)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  2. Jsoup解析XML

    先导入jsoup.jar  包 方法1:不推荐,了解即可 方法 方法3: 后期学习主流

  3. python 计算器

    import redef main(): #""代表的是空,split()方法已空格或者\t,\n进行切割,join方法是列表,元组,字典变为字符串 a = "" ...

  4. OOA/OOD/OOP

    转载自https://www.cnblogs.com/zzyoucan/p/3576932.html Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了 ...

  5. 关于Ajax的认识和封装(小记)

    一,Ajax 的概念 1,Ajax 是一种在无需重新加载整个网页(即刷新网页)的情况下,能够更新部分网页的技术. 2,Ajax 的全称是Asynchronous Javascript And XML” ...

  6. java-redis

    pom.xml添加如下配置: <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  7. CentOS 7 FTP环境部署

    FTP协议有两种工作方式: 1)port方式:主动模式 port(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求 , 服务器接受连接 , 建立一条命令链路 当需要传送数据 ...

  8. .Net Core技术研究-Span<T>和ValueTuple<T>

    性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...

  9. shell的输入参数

    $#  参数格式 $0 $1 $2 ...第一个,第二个参数...

  10. Java EE开发技术课程第六周(jsf、facelets)

    1.jsf(java sever faces) 1.1 jsf的定义: jsf是一种用于构建java web应用程序的框架.它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器 ...