Si vous êtes un programmeur Java, vous en avez probablement assez d'implémenter une fois le fastidieux setter, getter, hashcode et toString.
L'EDI ne l'implémente-t-il pas automatiquement ou n'utilise-t-il pas des outils comme lombok pour éviter de réfléchir à ce problème?
Kotlin dispose d'un mécanisme pour générer automatiquement ces déclarations gênantes en ajoutant un modificateur appelé data lors de la déclaration d'une classe.
Classe de personne
data class Person(val name:String, val age: Int)
Code qui utilise la classe Person
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)
Décompilez la classe person et convertissez le code implémenté automatiquement en Java
$ jad Person.class
Parsing Person.class... Generating Person.jad
Couldn't fully decompile method hashCode
La méthode de hashcode n'a pas pu être compilée de manière inverse. C'est [Le comportement du code est résumé dans le blog](http://yuyubu.hatenablog.com/entry/2018/03/30/ Assemblage inversé au mystère de hashCode% 28% 29 généré par la classe de données de Kotlin) Veuillez donc le lire si vous êtes intéressé.
Résultat de la compilation inverse de la classe Person
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;
}
Nous avons pu confirmer la génération automatique de hashCode, equals, toString, copy et #copy.