Lombok的注解使用

Posted 小刘你最强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lombok的注解使用相关的知识,希望对你有一定的参考价值。

Lombok注解

前言

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。

它所有的增强都是通过注解实现,所以了解其使用主要了解一下注解即可

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
    <version>1.18.16</version>
</dependency>

常用注解

@NoArgsConstructor/@AllArgsConstructor

这两个注解很好理解,就是为该类产生无参的构造方法和包含所有参数的构造方法。当然,成员变量都是非静态的。另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。

@EqualsAndHashCode

这个注解很好理解,用于生成生成hashCode()和equals()

@ToString

生成toString()方法

@Getter/@Setter

这一对注解从名字上就很好理解,用在成员变量上面或者类上面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,当然,默认为public

这两个注解直接用在类上,可以为此类里的所有非静态成员变量生成对应的get和set方法。如果是final变量,那就只会有get方法

@NonNull

这个注解可以用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常。

@RequiredArgsConstructor

使用类中所有带有@NonNull注解的或者带有final修饰的成员变量生成对应的构造方法

例子

@RequiredArgsConstructor
public class Example {

   @NonNull
   private Integer foo;
   private final String bar;
}

生成后

public class Example {
   @NonNull
   private Integer foo;
   private final String bar;

   public Example(@NonNull Integer foo, String bar) {
       if (foo == null) {
           throw new NullPointerException("foo is marked @NonNull but is null");
       } else {
           this.foo = foo;
           this.bar = bar;
       }
   }
}

@Builder

生成构建者(Builder)模式

例子

@Builder
public class Demo {
    private final int finalVal = 10;

    private String name;
    private int age;
}

生成

public class Demo {
    private final int finalVal = 10;
    private String name;
    private int age;

    Demo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static Demo.DemoBuilder builder() {
        return new Demo.DemoBuilder();
    }

    public static class DemoBuilder {
        private String name;
        private int age;

        DemoBuilder() {
        }

        public Demo.DemoBuilder name(String name) {
            this.name = name;
            return this;
        }

        public Demo.DemoBuilder age(int age) {
            this.age = age;
            return this;
        }

        public Demo build() {
            return new Demo(this.name, this.age);
        }

        public String toString() {
            String var10000 = this.name;
            return this.age;
        }
    }
}

当需要构建一个对象时:

 public static void main(String[] args) {
      Demo demo = Demo.builder().name("aa").age(10).build();
      System.out.println(demo); 
}

@Data

生成所有字段的getter、toString()、hashCode()、equals()、所有非final字段的setter、构造器,相当于设置了 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode

需要注意的是,这里不包括@NoArgsConstructor和@AllArgsConstructor

例子

@Data
public class Example {
   private int foo;
   private final String bar;
}

生成后

public class Example {
   private int foo;
   private final String bar;

   public Example(String bar) {
       this.bar = bar;
   }

   public int getFoo() {
       return this.foo;
   }

   public String getBar() {
       return this.bar;
   }

   public void setFoo(int foo) {
       this.foo = foo;
   }

   public boolean equals(Object o) {
       if (o == this) {
           return true;
       } else if (!(o instanceof Example)) {
           return false;
       } else {
           Example other = (Example)o;
           if (!other.canEqual(this)) {
               return false;
           } else if (this.getFoo() != other.getFoo()) {
               return false;
           } else {
               Object this$bar = this.getBar();
               Object other$bar = other.getBar();
               if (this$bar == null) {
                   if (other$bar != null) {
                       return false;
                   }
               } else if (!this$bar.equals(other$bar)) {
                   return false;
               }

               return true;
           }
       }
   }

   protected boolean canEqual(Object other) {
       return other instanceof Example;
   }

   public int hashCode() {
       int PRIME = true;
       int result = 1;
       int result = result * 59 + this.getFoo();
       Object $bar = this.getBar();
       result = result * 59 + ($bar == null ? 43 : $bar.hashCode());
       return result;
   }

   public String toString() {
       return "Example(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")";
   }
}

@Value
把类声明为final,并添加toString()、hashCode()等方法,相当于 @Getter

例子

@Value
public class Example {
   private Integer foo;
}

生成后

public final class Example {
   private final Integer foo;

   public Example(Integer foo) {
       this.foo = foo;
   }

   public Integer getFoo() {
       return this.foo;
   }

   public boolean equals(Object o) {
       if (o == this) {
           return true;
       } else if (!(o instanceof Example)) {
           return false;
       } else {
           Example other = (Example)o;
           Object this$foo = this.getFoo();
           Object other$foo = other.getFoo();
           if (this$foo == null) {
               if (other$foo != null) {
                   return false;
               }
           } else if (!this$foo.equals(other$foo)) {
               return false;
           }

           return true;
       }
   }

   public int hashCode() {
       int PRIME = true;
       int result = 1;
       Object $foo = this.getFoo();
       int result = result * 59 + ($foo == null ? 43 : $foo.hashCode());
       return result;
   }

   public String toString() {
       return "Example(foo=" + this.getFoo() + ")";
   }
}

@Synchronized

这个注解用在类方法或者实例方法上,效果和synchronized关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,而@Synchronized得锁对象分别是私有静态final对象LOCK和私有final对象lock,当然,也可以自己指定锁对象

例子

@Synchronized
public static void hello() {
    System.out.println("world");
}

@Synchronized
public int answerToLife() {
    return 42;
}

@Synchronized("readLock")
public void foo() {
    System.out.println("bar");
}

生成后:

public static void hello() {
    Object var0 = $LOCK;
    synchronized($LOCK) {
        System.out.println("world");
    }
}

public int answerToLife() {
    Object var1 = this.$lock;
    synchronized(this.$lock) {
        return 42;
    }
}

public void foo() {
    Object var1 = this.readLock;
    synchronized(this.readLock) {
        System.out.println("bar");
    }
}

@Slf4j/@Log4j

这个注解用在类上,可以省去从日志工厂生成日志对象这一步

例子

@Slf4j
class Parent {
}

生成后

class Parent {
    private static final Logger log = LoggerFactory.getLogger(Parent.class);

    Parent() {
    }
}

以上是关于Lombok的注解使用的主要内容,如果未能解决你的问题,请参考以下文章

lombok 注解

lombok的使用

lombok的@Data注解

Lombok的注解使用

使用Lombok @Builder注解导致默认值无效

lombok 注解简单介绍