Wenn Sie ein Java-Programmierer sind, haben Sie es wahrscheinlich satt, den mühsamen Setter, Getter, Hashcode und toString einmal zu implementieren.
Implementiert die IDE es nicht automatisch oder verwendet sie Tools wie Lombok, um nicht über dieses Problem nachzudenken?
Kotlin verfügt über einen Mechanismus zum automatischen Generieren dieser problematischen Deklarationen, indem beim Deklarieren einer Klasse ein Modifikator namens data hinzugefügt wird.
Personenklasse
data class Person(val name:String, val age: Int)
var bob = Person("Bob",33)
var bob2 = Person("Bob",33)
println(bob===bob2)//false
println(bob==bob2)//true
println(bob.equals(bob2))//true
println(bob.hashCode())//2075948
println(bob.toString())//Person(name=Bob, age=33)
Dekompilieren Sie die Personenklasse und konvertieren Sie den automatisch implementierten Code in Java
$ jad Person.class
Parsing Person.class... Generating Person.jad
Couldn't fully decompile method hashCode
Die Hashcode-Methode konnte nicht umgekehrt kompiliert werden. Dies ist [Das Codeverhalten ist im Blog zusammengefasst](http://yuyubu.hatenablog.com/entry/2018/03/30/ Reverse Assembly zum Geheimnis von HashCode% 28% 29, das von Kotlins Datenklasse generiert wurde) Bitte lesen Sie es, wenn Sie interessiert sind.
Umgekehrtes Kompilierungsergebnis der Personenklasse
import kotlin.jvm.internal.Intrinsics;
public final class Person
{
public final String getName()
{
return name;
}
public final int getAge()
{
return age;
}
public Person(String name, int age)
{
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
public final String component1()
{
return name;
}
public final int component2()
{
return age;
}
public final Person copy(String name, int age)
{
Intrinsics.checkParameterIsNotNull(name, "name");
return new Person(name, age);
}
public static volatile Person copy$default(Person person, String s, int i, int j, Object obj)
{
if((j & 1) != 0)
s = person.name;
if((j & 2) != 0)
i = person.age;
return person.copy(s, i);
}
public String toString()
{
return (new StringBuilder()).append("Person(name=").append(name).append(", age=").append(age).append(")").toString();
}
public int hashCode()
{
name;
if(name == null) goto _L2; else goto _L1
_L1:
hashCode();
goto _L3
_L2:
JVM INSTR pop ;
false;
_L3:
31;
JVM INSTR imul ;
age;
JVM INSTR iadd ;
return;
}
public boolean equals(Object obj)
{
label0:
{
if(this != obj)
{
if(!(obj instanceof Person))
break label0;
Person person = (Person)obj;
if(!Intrinsics.areEqual(name, person.name) || (age != person.age))
break label0;
}
return true;
}
return false;
}
private final String name;
private final int age;
}
Wir konnten die automatische Generierung von hashCode, equals, toString, copy und #copy bestätigen.