Site icon C1CTech

Kotlin Data Classes

<p>This tutorial is about Kotlin Data classes&comma; requirements that data class must fulfill&comma; and their standard functionalities&period;<&sol;p>&NewLine;<h4><span style&equals;"color&colon; &num;000080&semi;"><strong>Data Classes<&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"p1">Data classes  are classes whose main purpose is to hold data&sol;state and contains standard functionalities&period; A <span style&equals;"color&colon; &num;0000ff&semi;"><strong>data<&sol;strong><&sol;span> keyword is used to declare a class as a data class&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;<&sol;pre>&NewLine;<p class&equals;"p1">Data class internally contains the following functions&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">equals&lpar;&rpar;&colon; Boolean<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">hashCode&lpar;&rpar;&colon; Int<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">toString&lpar;&rpar;&colon; String<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">component&lpar;&rpar; functions corresponding to the properties<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">copy&lpar;&rpar;<&sol;span><&sol;strong><&sol;li>&NewLine;<&sol;ul>&NewLine;<p class&equals;"p1">Due to presence of above functions internally in data class&comma; the data class eliminates the boilerplate code&period;<&sol;p>&NewLine;<h5><span style&equals;"color&colon; &num;000080&semi;"><strong>Data Class Example<&sol;strong><&sol;span><&sol;h5>&NewLine;<pre><span style&equals;"color&colon; &num;008000&semi;"><strong>data<&sol;strong><&sol;span> class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&rpar;&NewLine; println&lpar;"name &equals; &dollar;&lbrace;s1&period;name&rcub;"&rpar;&NewLine; println&lpar;"age &equals; &dollar;&lbrace;s1&period;age&rcub;"&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Output&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>name &equals; Rocky&NewLine;age &equals; 29<&sol;pre>&NewLine;<p class&equals;"p1">When you declare a <span style&equals;"color&colon; &num;0000ff&semi;"><strong>data<&sol;strong><&sol;span> class&comma; the compiler automatically generates several functions such as <span style&equals;"color&colon; &num;008000&semi;"><strong>toString&lpar;&rpar;<&sol;strong><&sol;span>&comma; <strong><span style&equals;"color&colon; &num;008000&semi;">equals&lpar;&rpar;<&sol;span><&sol;strong>&comma; <span style&equals;"color&colon; &num;008000&semi;"><strong>hashcode&lpar;&rpar;<&sol;strong><&sol;span> etc behind the scenes&period;<&sol;p>&NewLine;<h4 class&equals;"p1"><span style&equals;"color&colon; &num;000080&semi;"><b>Data Class Requirements<&sol;b><&sol;span><&sol;h4>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1">The <strong><span style&equals;"color&colon; &num;008000&semi;">primary<&sol;span> <&sol;strong>constructor must have at least one parameter&period;<&sol;li>&NewLine;<li class&equals;"li1">The parameters of the primary constructor must be marked as either <strong><span style&equals;"color&colon; &num;008000&semi;">val<&sol;span><&sol;strong> &lpar;read-only&rpar; or <strong><span style&equals;"color&colon; &num;008000&semi;">var<&sol;span><&sol;strong> &lpar;read-write&rpar;&period;<&sol;li>&NewLine;<li class&equals;"li1">The class cannot be <strong><span style&equals;"color&colon; &num;008000&semi;">open<&sol;span><&sol;strong>&comma; <strong><span style&equals;"color&colon; &num;008000&semi;">abstract<&sol;span><&sol;strong>&comma; <strong><span style&equals;"color&colon; &num;008000&semi;">inner<&sol;span><&sol;strong> or <strong><span style&equals;"color&colon; &num;008000&semi;">sealed<&sol;span><&sol;strong>&period;<&sol;li>&NewLine;<li class&equals;"li1">The class may extend other classes or implement interfaces&period; If you are using Kotlin version before <span style&equals;"color&colon; &num;0000ff&semi;"><strong>1&period;1<&sol;strong><&sol;span>&comma; the class can only implement interfaces&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<h4 id&equals;"properties-declared-in-the-class-body" data-toc&equals;"data-classes&num;properties-declared-in-the-class-body"><span class&equals;"article&lowbar;&lowbar;header" style&equals;"color&colon; &num;000080&semi;"><strong><span class&equals;"article&lowbar;&lowbar;title">Properties declared in the class body<&sol;span><&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"p1">The compiler only uses the properties defined inside the primary constructor for the automatically generated functions&period; To exclude a property from the generated implementations&comma; declare it inside the class body&colon;<&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&rpar; &lbrace;&NewLine; var age&colon; Int &equals; 0&NewLine;&rcub;<&sol;pre>&NewLine;<p>Only the property <strong><span style&equals;"color&colon; &num;0000ff&semi;">name<&sol;span><&sol;strong> will be used inside the <span style&equals;"color&colon; &num;008000&semi;"><strong>toString&lpar;&rpar;&comma; equals&lpar;&rpar;&comma; hashCode&lpar;&rpar;&comma; <&sol;strong><span style&equals;"color&colon; &num;000000&semi;">and<&sol;span><strong> copy&lpar;&rpar;<&sol;strong><&sol;span> implementations&comma; and there will only be one component function <strong><span style&equals;"color&colon; &num;008000&semi;">component1&lpar;&rpar;<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<p class&equals;"p1">Let&&num;8217&semi;s understand these functions&colon;<&sol;p>&NewLine;<h4><span style&equals;"color&colon; &num;000080&semi;"><strong>toString&lpar;&rpar; method<&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"p1">Let&&num;8217&semi;s see a simple program without data class&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&rpar;&NewLine; println&lpar;s1&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p class&equals;"p1">Here&comma; we are printing the reference of <span style&equals;"color&colon; &num;008000&semi;"><b>Student<&sol;b><&sol;span> object which displays the <span style&equals;"color&colon; &num;008000&semi;"><strong>hashCode&lpar;&rpar;<&sol;strong> <&sol;span>with class name of <span style&equals;"color&colon; &num;008000&semi;"><b>Student<&sol;b><&sol;span>&period; It does not print the data&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Output&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;<pre>Student&commat;49476842<&sol;pre>&NewLine;<p class&equals;"p1">The above program is rewritten using <span style&equals;"color&colon; &num;0000ff&semi;"><b>data class<&sol;b><&sol;span> and printing the reference of <span style&equals;"color&colon; &num;008000&semi;"><b>Student<&sol;b><&sol;span> class and displaying the data of object&period; It happens because the data class internally contains the <span style&equals;"color&colon; &num;000080&semi;"><strong>toString&lpar;&rpar;<&sol;strong><&sol;span> <strong>which display the string representation of object<&sol;strong>&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&rpar;&NewLine; println&lpar;s1&rpar;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;or<&sol;span><&sol;strong>&NewLine; println&lpar;s1&period;toString&lpar;&rpar;&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Output&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>Student&lpar;name&equals;Rocky&comma; age&equals;29&rpar;&NewLine;Student&lpar;name&equals;Rocky&comma; age&equals;29&rpar;<&sol;pre>&NewLine;<h4 class&equals;"h3"><span style&equals;"color&colon; &num;000080&semi;"><strong>copy&lpar;&rpar; method<&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"p1">The data class provides a <span style&equals;"color&colon; &num;008000&semi;"><strong>copy&lpar;&rpar;<&sol;strong><&sol;span> method which is used to create a copy of object&period; Using copy&lpar;&rpar; method&comma; some or all properties of object can be altered&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Example&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Wilson"&comma; 29&rpar;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; using copy function to create an object<&sol;strong><&sol;span>&NewLine; val s2 &equals; s1&period;copy&lpar;name &equals; "Rocky"&rpar;&NewLine;&NewLine; println&lpar;s1&rpar;&NewLine; println&lpar;s2&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Output&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>Student&lpar;name&equals;Wilson&comma; age&equals;29&rpar;&NewLine;Student&lpar;name&equals;Rocky&comma; age&equals;29&rpar;<&sol;pre>&NewLine;<h4><span style&equals;"color&colon; &num;000080&semi;"><strong>hashCode&lpar;&rpar; and equals&lpar;&rpar;<&sol;strong><&sol;span><&sol;h4>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">hashCode&lpar;&rpar;&colon;<&sol;span><&sol;strong> returns a <span style&equals;"color&colon; &num;008000&semi;"><strong>hash code<&sol;strong><&sol;span> <strong><span style&equals;"color&colon; &num;008000&semi;">value<&sol;span><&sol;strong> for the object&period;<&sol;p>&NewLine;<ul>&NewLine;<li>Two hash codes declared two times on same object will be equal&period;<&sol;li>&NewLine;<li>If two objects are equal according to <span style&equals;"color&colon; &num;008000&semi;"><strong>equals<&sol;strong>&lpar;&rpar;<&sol;span> method&comma; then the hash codes<br &sol;>&NewLine;returned will also be same&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">equals&lpar;&rpar;&colon;<&sol;span><&sol;strong> return <strong><span style&equals;"color&colon; &num;008000&semi;">true<&sol;span><&sol;strong> if two objects have same contents and it works similar to <strong><span style&equals;"color&colon; &num;0000ff&semi;">&OpenCurlyDoubleQuote;&equals;&equals;”<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&rpar;&NewLine; val s2 &equals; s1&period;copy&lpar;&rpar;&NewLine; val s3 &equals; s1&period;copy&lpar;name &equals; "Wilson"&rpar;&NewLine;&NewLine; println&lpar;"s1 &colon; &dollar;s1 hashcode &colon; &dollar;&lbrace;s1&period;hashCode&lpar;&rpar;&rcub;"&rpar;&NewLine; println&lpar;"s2 &colon; &dollar;s2 hashcode &colon; &dollar;&lbrace;s2&period;hashCode&lpar;&rpar;&rcub;"&rpar;&NewLine; println&lpar;"s3 &colon; &dollar;s3 hashcode &colon; &dollar;&lbrace;s3&period;hashCode&lpar;&rpar;&rcub;"&rpar;&NewLine;&NewLine; if &lpar;s1&period;equals&lpar;s2&rpar; &equals;&equals; true&rpar;&NewLine; println&lpar;"s1 is equal to s2&period;"&rpar;&NewLine; else&NewLine; println&lpar;"s1 is not equal to s2&period;"&rpar;&NewLine;&NewLine; if &lpar;s1&period;equals&lpar;s3&rpar; &equals;&equals; true&rpar;&NewLine; println&lpar;"s1 is equal to s3&period;"&rpar;&NewLine; else&NewLine; println&lpar;"s1 is not equal to s3&period;"&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Output&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre class&equals;"p1">s1 &colon; Student&lpar;name&equals;Rocky&comma; age&equals;29&rpar; hashcode &colon; -1841810167&NewLine;s2 &colon; Student&lpar;name&equals;Rocky&comma; age&equals;29&rpar; hashcode &colon; -1841810167&NewLine;s3 &colon; Student&lpar;name&equals;Wilson&comma; age&equals;29&rpar; hashcode &colon; -1282221179&NewLine;s1 is equal to s2&period;&NewLine;s1 is not equal to s3&period;<&sol;pre>&NewLine;<h4 id&equals;"data-classes-and-destructuring-declarations"><span style&equals;"color&colon; &num;000080&semi;"><strong>Destructuring Declarations<&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"p1">You can destructure an object into a number of variables using <span style&equals;"color&colon; &num;0000ff&semi;"><strong><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;kotlinlang&period;org&sol;docs&sol;reference&sol;multi-declarations&period;html"><span class&equals;"s1">destructing declaration<&sol;span><&sol;a><&sol;strong><&sol;span>&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&comma; val gender&colon; String&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&comma; "Male"&rpar;&NewLine;&NewLine; val &lpar;name&comma; age&comma; gender&rpar; &equals; s1&NewLine; println&lpar;"name &equals; &dollar;name"&rpar;&NewLine; println&lpar;"age &equals; &dollar;age"&rpar;&NewLine; println&lpar;"gender &equals; &dollar;gender"&rpar;&NewLine;&rcub;<&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Output&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>name &equals; Rocky&NewLine;age &equals; 29&NewLine;gender &equals; Male<&sol;pre>&NewLine;<p>This is possible because the compiler generates componentN&lpar;&rpar; functions for all properties of a data class &lpar;defined inside the primary constructor&rpar;&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Example&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>data class Student&lpar;val name&colon; String&comma; val age&colon; Int&comma; val gender&colon; String&rpar;&NewLine;&NewLine;fun main&lpar;&rpar; &lbrace;&NewLine; val s1 &equals; Student&lpar;"Rocky"&comma; 29&comma; "Male"&rpar;&NewLine;&NewLine; println&lpar;s1&period;component1&lpar;&rpar;&rpar; &sol;&sol; Rocky&NewLine; println&lpar;s1&period;component2&lpar;&rpar;&rpar; &sol;&sol; 29 &NewLine; println&lpar;s1&period;component3&lpar;&rpar;&rpar; &sol;&sol;Male&NewLine;&rcub;<&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Output&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>Rocky&NewLine;29&NewLine;Male<&sol;pre>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;&NewLine;

Exit mobile version