In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-03-28 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >
Share
Shulou(Shulou.com)06/02 Report--
This article mainly explains "the use of @ Data in Lombok". The content of the explanation is simple and clear, and it is easy to learn and understand. Please follow the editor's train of thought to study and learn "the use of @ Data in Lombok".
Lombok
First, let's give a brief introduction to Lombok. The official introduction is as follows: > Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.
Lombok can make Java code concise and fast by adding some "handlers".
Lombok provides a series of annotations to help us simplify the code, such as:
The annotation name function @ Setter automatically adds all attribute-related set methods @ Getter in the class automatically adds all attribute-related get methods @ Builder in the class so that the class can generate a class constructor through the builder (builder mode) construction object @ RequiredArgsConstructor. No parameter construction @ ToString is prohibited from overriding the toString () method @ EqualsAndHashCode of this class. The equals () and hashCode () methods @ Data of this class are equivalent to @ Setter, @ Getter, @ RequiredArgsConstructor, @ ToString, @ EqualsAndHashCode above.
It seems that these annotations are normal and have some optimizations to our code, so why is there a hole in the @ Data annotation?
Internal implementation of @ Data annotations
From the table above, we can see that @ Data contains the function of @ EqualsAndHashCode, so how on earth does it override the equals () and hashCode () methods?
We define a class TestA:
@ Datapublic class TestA {String oldName;}
We decompiled the compiled class file:
Public class TestA {String oldName; public TestA () {} public String getOldName () {return this.oldName;} public void setOldName (String oldName) {this.oldName = oldName;} public boolean equals (Object o) {/ / determine whether it is the same object if (o = = this) {return true } / / determine whether it is the same class else if (! (o instanceof TestA)) {return false;} else {TestA other = (TestA) o; if (! other.canEqual (this)) {return false } else {/ / compare the attributes in the class (note that only the attributes in the current class are compared) Object this$oldName = this.getOldName (); Object other$oldName = other.getOldName (); if (this$oldName = = null) {if (other$oldName! = null) {return false }} else if (! this$oldName.equals (other$oldName)) {return false;} return true;} protected boolean canEqual (Object other) {return other instanceof TestA;} public int hashCode () {int PRIME = true; int result = 1 Object $oldName= this.getOldName (); int result = result * 59 + ($oldName= = null? 43: $oldName.hashCode ()); return result;} public String toString () {return "TestA (oldName=" + this.getOldName () + ")";}}
For its equals () method, when it makes a property comparison, it only compares the properties in the current class. If you don't believe me, let's create another class, TestB, which is a subclass of TestA:
@ Datapublic class TestB extends TestA {private String name; private int age;}
We decompiled the compiled class file:
Public class TestB extends TestA {private String name; private int age; public TestB () {} public String getName () {return this.name;} public int getAge () {return this.age;} public void setName (String name) {this.name = name;} public void setAge (int age) {this.age = age } public boolean equals (Object o) {if (o = = this) {return true;} else if (! (o instanceof TestB)) {return false;} else {TestB other = (TestB) o; if (! other.canEqual (this)) {return false } else {/ / Note here, it really only compares the properties in the current class, and does not compare the attributes in the parent class Object this$name = this.getName (); Object other$name = other.getName () If (this$name = = null) {if (other$name = = null) {return this.getAge () = = other.getAge ();}} else if (this$name.equals (other$name)) {return this.getAge () = = other.getAge () } return false;}} protected boolean canEqual (Object other) {return other instanceof TestB;} public int hashCode () {int PRIME = true; int result = 1; Object $name = this.getName (); int result = result * 59 + ($name = = null? 43: $name.hashCode ()) Result = result * 59 + this.getAge (); return result;} public String toString () {return "TestB (name=" + this.getName () + ", age=" + this.getAge () + ")";}}
According to the understanding of the code, if two subclass objects have the same properties in the subclass and different properties in the parent class, when using the equals () method, the two objects will still be considered the same, so test it:
Public static void main (String [] args) {TestB T1 = new TestB (); TestB T2 = new TestB (); t1.setOldName ("123"); t2.setOldName ("12345"); String name = "1"; t1.name = name; t2.name = name; int age = 1; t1.age = age; t2.age = age System.out.println (t1.equals (T2)); System.out.println (t2.equals (T1)); System.out.println (t1.hashCode ()); System.out.println (t2.hashCode ()); System.out.println (T1 = = T2); System.out.println (Objects.equals (T1, T2));}
The result is:
Summary of truetrue63736373falsetrue problem
> for a class whose parent class is Object and annotated with @ EqualsAndHashCode (callSuper = true), the equals () method generated by Lombok returns true only if two objects are the same object, otherwise it is always false, regardless of whether their attributes are the same or not. > > this behavior is not as expected most of the time, and equals () loses its meaning. Even if we expect equals () to work this way, the rest of the attribute comparison code is cumbersome and greatly reduces branch coverage of the code.
Solution method
If you use @ Data, you don't have an inheritance relationship, similar to Kotlin.
Override equals () yourself, and Lombok does not generate methods that are explicitly overridden.
Explicitly use @ EqualsAndHashCode (callSuper = true), and the Lombok will prevail as explicitly specified.
Thank you for your reading, the above is the content of "the use of @ Data in Lombok". After the study of this article, I believe you have a deeper understanding of the use of @ Data in Lombok. Here is, the editor will push for you more related knowledge points of the article, welcome to follow!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.