前言

  在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. 2019春第六周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 对指针的使用更加得心应手 参考文献与网址 C语 ...

  2. Centos7 HyperLedger Fabric 1.4 生产环境部署

    Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...

  3. 【Eclipse】-NO.163.Eclipse.1 -【Eclipse springboot 1.x 创建maven工程初始化报错】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  4. Oracle 10053

    [10053]alter session set events '10053 trace name context forever,level 1'; <Run your SQL here;&g ...

  5. ubuntu 16.04 安装wechat, chrome等

    安装wechat 按照https://www.jb51.net/article/131179.htm,结果发现不行. 用apt-get install electronic-wechat的方式呢,也不 ...

  6. java代码审计中的一些常见漏洞及其特征函数

    文章来源:https://xz.aliyun.com/t/1633 最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函 ...

  7. “QObject调用moveToThread()后 该如何释放”及QThread 的启动关闭

    1 QThread *thread = new QThread( ); 2 Task *task = new Task(); 3 task->moveToThread(thread); 4 co ...

  8. UGUI血条跟随

    定义常量 public class Content { //当前UI分辨率 public const float UI_Width = 1366f; public const float UI_Hei ...

  9. Python练习:爬虫练习,从一个提供免费代理的网站中爬取IP地址信息

    西刺代理,http://www.xicidaili.com/,提供免费代理的IP,是爬虫程序的目标网站. 开始写程序 import urllib.requestimport re def open_u ...

  10. extjs +String2 +Spring 下的分页 以及返回json格式错误的问题

    首先,分页  很简单. 1前台extjs数据源, var shipMgrStore = Ext.create('Ext.data.Store', { model: 'App.ShipMgr.model ...