Lombok introduction to mastery

Posted by ashleek007 on Wed, 16 Feb 2022 02:47:54 +0100

1, Preface

The use of Lombok is controversial. The author strongly recommends Lombok, and even believes that some common functions should be directly integrated in the form of JDK.

It is meaningless to write a bunch of Set/Get methods in the process of building entity classes; The toString method that inherits the Object class by default is officially recommended to be rewritten. Each entity class rewrites the toString method to express concrete entity information, which is cumbersome.

2, Common annotation analysis

(1) Entity class annotation

The annotations discussed below are added to entity classes.

public class XUser {
   private Integer userId;
   private String userName;
}
1,@Data

After adding @ Data annotation, the compiled entity class will automatically add the following information: the Set/Get method of the attribute will automatically increase or decrease after change; The default constructor, in which the equals method, hashCode method and toString method are overridden by Lombok. The rewriting logic will be discussed in detail later.

2,@AllArgsConstructor

After adding @ AllArgsConstructor annotation, the compiled entity will automatically add the following information: all parameter constructor. After adding @ AllArgsConstructor annotation, the annotation @ NoArgsConstructor without parameter constructor is generally required.

After adding @ AllArgsConstructor annotation, the entity class changes as follows after adding @ NoArgsConstructor:

3,@ToString

After adding @ toString annotation, the compiled entity will automatically add the following information: rewritten toString method.

@ToString annotation does not need to be added when @ Data annotation exists, unless its attribute configuration is required. The common attribute configuration is callSuper = true, which means that the attribute values of the parent class are added to the overridden toString method.

4,@Builder

After adding @ Builder annotation, the compiled entity will automatically add the following information: chained Set method.

The advantages of the chain Set method are as follows:

// Instantiate the entity class in a concise way and complete the assignment operation
XUser xUser = XUser.builder().userId(1).userName("AAAAA").build();
5,@Accessors

After adding the @ accessories (chain = true) annotation, the compiled entity class changes as follows: the setXxx method has a return value and is an example of the current object. There are three points to note when using this annotation:

  • This annotation is experimental and may be deleted later;
  • This annotation sets the attribute chain to true, which is one of the necessary conditions for the effect to take effect;
  • Use with @ Data annotation or @ Setter annotation is a necessary condition for the effect to take effect.
@Setter
@Accessors(chain = true)
public class XUser {
   private Integer userId;
   private String userName;
}

Introduction to main parameters

parameter

Default value

notes

fluent

false

Controls whether the generated getter and setter methods are preceded by get/set. If it is true, the chain will start automatically without setting again

chain

chain

If it is set to true, the setter returns this object, which is convenient for chain calling methods

The parameter fluent should be used with caution. For Jackson serialization framework, methods without get/set prefix have the probability of being unrecognized.

(2) Service class annotation

The above mentioned annotations are commonly used for entity classes. Here we mainly talk about service class annotations. There is no obvious distinction between the two. Both can be used in theory. This place only distinguishes them according to the occasion of use.

1,@Log4j2

After adding @Log4j2 annotations to the class, the current class instance automatically holds the log member variable, which can be used to add log information.

@Log4j2
public class XUserServiceImpl {
   public void saveUser(XUser user) {
       log.info("This method saves user information");
  }
}

Such information changes as follows:

3, Process inquiry

(1) Rewrite

Some annotations in Lombok will override the following methods: equals method, hashCode method, toString method

1. toString method

(1) Default implementation

Implementation of superclass Object inherited by default

public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Examples

XUser xUser = new XUser();
System.out.println(xUser.toString());
System.out.println(xUser.toString());

The output results of the same instance are consistent

xin.altitude.lombok.domain.XUser@43d7741f
xin.altitude.lombok.domain.XUser@43d7741f

(2) Rewrite implementation

Examples

System.out.println(new XUser(1,"AAAAA").toString());
System.out.println(new XUser(1,"AAAAA").toString());~

The output values of the same member variables are the same. The output results are different only when the member variables are different, which has nothing to do with the execution times and the instance object reference.

XUser(userId=1, userName=AAAAA)
XUser(userId=1, userName=AAAAA)
2. equals method

(1) Default implementation

Implementation of superclass Object inherited by default

public boolean equals(Object obj) {
   return (this == obj);
}

Examples

XUser xUser1 = new XUser(1, "AAAAA");
XUser xUser2 = xUser1;
// In the same JVM, the same reference object instance is the same (the output is true)
boolean bl = xUser1.equals(xUser2);

(2) Rewrite implementation

Examples

// Whether the attribute values of the object are equal (the output is true)
boolean bl = new XUser(1, "AAAAA").equals(new XUser(1, "AAAAA"));

The object constructed from the same member variable uses the rewritten equals method, and the result is true no matter how many times it is executed.

Original address