zoukankan      html  css  js  c++  java
  • lombok的简单使用

    1.安装插件

    1.找到lombok-1.18.12.jar

    java -jar ./lombok-1.18.12.jar

     2.选择Eclipse对应的安装位置之后安装

    3.安装成功在eclipse目录会生成lombok.jar

    同时eclipse.ini也会增加一行:

    -javaagent:E:Eclipseeclipse-jee-mars-1-win32-x86_64eclipse-jee-mars-1-win32-x86_64eclipselombok.jar

    4.重启eclipse即可

     二、lombok简单使用

    pom文件引入依赖:

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>

    1.测试常用注解@Getter、@Setter、@EqualsAndHashCode、@ToString

    package cn.qlq.lombok;
    
    import lombok.EqualsAndHashCode;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    @Getter
    @Setter
    @EqualsAndHashCode
    @ToString
    public class User {
    
        private long id;
    
        private String username;
    
    }

    jd反编译后查看代码:

    package cn.qlq.lombok;
    
    public class User
    {
      private long id;
      private String username;
      
      public String getUsername()
      {
        return this.username;
      }
      
      public long getId()
      {
        return this.id;
      }
      
      public void setUsername(String username)
      {
        this.username = username;
      }
      
      public void setId(long id)
      {
        this.id = id;
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof User;
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = 1;long $id = getId();result = result * 59 + (int)($id ^ $id >>> 32);Object $username = getUsername();result = result * 59 + ($username == null ? 43 : $username.hashCode());return result;
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof User)) {
          return false;
        }
        User other = (User)o;
        if (!other.canEqual(this)) {
          return false;
        }
        if (getId() != other.getId()) {
          return false;
        }
        Object this$username = getUsername();Object other$username = other.getUsername();return this$username == null ? other$username == null : this$username.equals(other$username);
      }
      
      public String toString()
      {
        return "User(id=" + getId() + ", username=" + getUsername() + ")";
      }
    }

    2.@NoArgsConstructor 、@AllArgsConstructor分别用于无参构造和有参构造

    package cn.qlq.lombok;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    
    @NoArgsConstructor // 无参构造
    @AllArgsConstructor // 有参构造
    public class User {
    
        private long id;
    
        private String username;
    
    }

    反编译查看代码:

    package cn.qlq.lombok;
    
    public class User
    {
      private long id;
      private String username;
      
      public User() {}
      
      public User(long id, String username)
      {
        this.id = id;this.username = username;
      }
    }

    3.@Data 相当于@Getter、@Setter、@EqualsAndHashCode、@ToString

    package cn.qlq.lombok;
    
    import lombok.Data;
    
    @Data
    public class User {
    
        private long id;
    
        private String username;
    
    }

    反编译查看:

    package cn.qlq.lombok;
    
    public class User
    {
      private long id;
      private String username;
      
      public String toString()
      {
        return "User(id=" + getId() + ", username=" + getUsername() + ")";
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = 1;long $id = getId();result = result * 59 + (int)($id ^ $id >>> 32);Object $username = getUsername();result = result * 59 + ($username == null ? 43 : $username.hashCode());return result;
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof User;
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof User)) {
          return false;
        }
        User other = (User)o;
        if (!other.canEqual(this)) {
          return false;
        }
        if (getId() != other.getId()) {
          return false;
        }
        Object this$username = getUsername();Object other$username = other.getUsername();return this$username == null ? other$username == null : this$username.equals(other$username);
      }
      
      public void setUsername(String username)
      {
        this.username = username;
      }
      
      public void setId(long id)
      {
        this.id = id;
      }
      
      public String getUsername()
      {
        return this.username;
      }
      
      public long getId()
      {
        return this.id;
      }
    }

    查看@Data源码如下:其实还有@RequiredArgsConstructor ,只是这个注解一般不用。

    /** <a href="http://www.cpupk.com/decompiler">Eclipse Class Decompiler</a> plugin, Copyright (c) 2017 Chen Chao. */
    package lombok;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check
     * all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor.
     * <p>
     * Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
     * <p>
     * Complete documentation is found at <a href="https://projectlombok.org/features/Data">the project lombok features page for &#64;Data</a>.
     * 
     * @see Getter
     * @see Setter
     * @see RequiredArgsConstructor
     * @see ToString
     * @see EqualsAndHashCode
     * @see lombok.Value
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Data {
        /**
         * If you specify a static constructor name, then the generated constructor will be private, and
         * instead a static factory method is created that other classes can use to create instances.
         * We suggest the name: "of", like so:
         * 
         * <pre>
         *     public @Data(staticConstructor = "of") class Point { final int x, y; }
         * </pre>
         * 
         * Default: No static constructor, instead the normal constructor is public.
         * 
         * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).
         */
        String staticConstructor() default "";
    }

    需要注意:@Data生成toString和equals、hashCode时不会选择父类的字段,如下:

    父类:

    package cn.qlq.lombok;
    
    import java.io.Serializable;
    
    import lombok.Data;
    
    @Data
    public abstract class AbstractSequenceEntity implements Serializable {
    
        private static final long serialVersionUID = 7304379208787774552L;
    
        protected Long id;
    }

    反编译查看:

    package cn.qlq.lombok;
    
    import java.io.Serializable;
    
    public abstract class AbstractSequenceEntity
      implements Serializable
    {
      private static final long serialVersionUID = 7304379208787774552L;
      protected Long id;
      
      public String toString()
      {
        return "AbstractSequenceEntity(id=" + getId() + ")";
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = 1;Object $id = getId();result = result * 59 + ($id == null ? 43 : $id.hashCode());return result;
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof AbstractSequenceEntity;
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof AbstractSequenceEntity)) {
          return false;
        }
        AbstractSequenceEntity other = (AbstractSequenceEntity)o;
        if (!other.canEqual(this)) {
          return false;
        }
        Object this$id = getId();Object other$id = other.getId();return this$id == null ? other$id == null : this$id.equals(other$id);
      }
      
      public void setId(Long id)
      {
        this.id = id;
      }
      
      public Long getId()
      {
        return this.id;
      }
    }

    子类如下:

    package cn.qlq.lombok;
    
    import lombok.Data;
    
    @Data
    public class User extends AbstractSequenceEntity {
    
        private static final long serialVersionUID = 1487903039867324395L;
    
        private String username;
    
    }

    反编译查看:没有从父类继承的属性

    package cn.qlq.lombok;
    
    public class User
      extends AbstractSequenceEntity
    {
      private static final long serialVersionUID = 1487903039867324395L;
      private String username;
      
      public String toString()
      {
        return "User(username=" + getUsername() + ")";
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = 1;Object $username = getUsername();result = result * 59 + ($username == null ? 43 : $username.hashCode());return result;
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof User;
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof User)) {
          return false;
        }
        User other = (User)o;
        if (!other.canEqual(this)) {
          return false;
        }
        Object this$username = getUsername();Object other$username = other.getUsername();return this$username == null ? other$username == null : this$username.equals(other$username);
      }
      
      public void setUsername(String username)
      {
        this.username = username;
      }
      
      public String getUsername()
      {
        return this.username;
      }
    }

    解决办法:

    package cn.qlq.lombok;
    
    import lombok.EqualsAndHashCode;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    @Getter
    @Setter
    // callSuper: 是否包含父类的属性
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    public class User extends AbstractSequenceEntity {
    
        private static final long serialVersionUID = 1487903039867324395L;
    
        private String username;
    
    }

    反编译查看:

    package cn.qlq.lombok;
    
    public class User
      extends AbstractSequenceEntity
    {
      private static final long serialVersionUID = 1487903039867324395L;
      private String username;
      
      public String getUsername()
      {
        return this.username;
      }
      
      public void setUsername(String username)
      {
        this.username = username;
      }
      
      public String toString()
      {
        return "User(super=" + super.toString() + ", username=" + getUsername() + ")";
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof User)) {
          return false;
        }
        User other = (User)o;
        if (!other.canEqual(this)) {
          return false;
        }
        if (!super.equals(o)) {
          return false;
        }
        Object this$username = getUsername();Object other$username = other.getUsername();return this$username == null ? other$username == null : this$username.equals(other$username);
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof User;
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = super.hashCode();Object $username = getUsername();result = result * 59 + ($username == null ? 43 : $username.hashCode());return result;
      }
    }

    4.@Slf4j可以整合日志

    原来我们使用日志的方式如下:

    package cn.qlq.lombok;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class User {
    
        private static final Logger log = LoggerFactory.getLogger(User.class);
    
    }

    注解方式如下:

    package cn.qlq.lombok;
    
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class User {
    
    
    }

    反编译查看:

    package cn.qlq.lombok;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class User
    {
      private static final Logger log = LoggerFactory.getLogger(User.class);
    }

    5.@Builder用于生成加个构造者模式

    package cn.qlq.lombok;
    
    import lombok.Builder;
    import lombok.Data;
    
    @Data
    @Builder
    public class User  {
    
        private long id;
        
        private String username;
    
    }

    测试代码:

    package cn.qlq.lombok;
    
    public class Client {
        public static void main(String[] args) {
            // 两种方式创建Builder
            // UserBuilder builder = User.builder();
            User.UserBuilder userBuilder = new User.UserBuilder();
            User user = userBuilder.id(5).username("admin").build();
            System.out.println(user);
        }
    }

    结果:

    User(id=5, username=admin)

    反编译查看:(User$UserBuilder.class是内部类编译后生成的cass文件)

    package cn.qlq.lombok;
    
    public class User
    {
      private long id;
      private String username;
      
      public String toString()
      {
        return "User(id=" + getId() + ", username=" + getUsername() + ")";
      }
      
      public int hashCode()
      {
        int PRIME = 59;int result = 1;long $id = getId();result = result * 59 + (int)($id ^ $id >>> 32);Object $username = getUsername();result = result * 59 + ($username == null ? 43 : $username.hashCode());return result;
      }
      
      protected boolean canEqual(Object other)
      {
        return other instanceof User;
      }
      
      public boolean equals(Object o)
      {
        if (o == this) {
          return true;
        }
        if (!(o instanceof User)) {
          return false;
        }
        User other = (User)o;
        if (!other.canEqual(this)) {
          return false;
        }
        if (getId() != other.getId()) {
          return false;
        }
        Object this$username = getUsername();Object other$username = other.getUsername();return this$username == null ? other$username == null : this$username.equals(other$username);
      }
      
      public void setUsername(String username)
      {
        this.username = username;
      }
      
      public void setId(long id)
      {
        this.id = id;
      }
      
      public String getUsername()
      {
        return this.username;
      }
      
      public long getId()
      {
        return this.id;
      }
      
      public static class UserBuilder
      {
        private long id;
        private String username;
        
        public String toString()
        {
          return "User.UserBuilder(id=" + this.id + ", username=" + this.username + ")";
        }
        
        public User build()
        {
          return new User(this.id, this.username);
        }
        
        public UserBuilder username(String username)
        {
          this.username = username;return this;
        }
        
        public UserBuilder id(long id)
        {
          this.id = id;return this;
        }
      }
      
      public static UserBuilder builder()
      {
        return new UserBuilder();
      }
      
      User(long id, String username)
      {
        this.id = id;this.username = username;
      }
    }
    package cn.qlq.lombok;
    
    public class User$UserBuilder
    {
      private long id;
      private String username;
      
      public String toString()
      {
        return "User.UserBuilder(id=" + this.id + ", username=" + this.username + ")";
      }
      
      public User build()
      {
        return new User(this.id, this.username);
      }
      
      public UserBuilder username(String username)
      {
        this.username = username;return this;
      }
      
      public UserBuilder id(long id)
      {
        this.id = id;return this;
      }
    }

    补充一些其他不常用的注解:

    @Cleanup : 可以关闭流
    @Synchronized : 加个同步锁

    @SneakyThrows : 等同于try/catch 捕获异常

    @NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常

    @Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。

  • 相关阅读:
    Codeforces Beta Round #17 A
    Codeforces Round #382 (Div. 2) D. Taxes 哥德巴赫猜想
    Codeforces Round #382 (Div. 2)C. Tennis Championship 动态规划
    Codeforces Round #382 (Div. 2)B. Urbanization 贪心
    Codeforces Round #382 (Div. 2) A. Ostap and Grasshopper bfs
    Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
    Codeforces Beta Round #62 题解【ABCD】
    Codeforces Round #160 (Div. 1) 题解【ABCD】
    Codeforces Round #383 (Div. 2) 题解【ABCDE】
    Codeforces Round #271 (Div. 2)题解【ABCDEF】
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/13276790.html
Copyright © 2011-2022 走看看