কটলিন ডেটা ক্লাস:
ডেটা নিয়ে কাজ করার জন্য ডেটা ক্লাস ব্যবহার করা যায়। এটি মূলত অন্যান্য কাজের পাশাপাশি ডেটা ধরে রেখে তা নিয়ে কাজ করার জন্য বিশেষ ক্লাস। তাহলে বলতে পারি যে, ডেটা ক্লাস হলো ডেটার প্লেসহোল্ডার বা ধারক।
ডেটা ক্লাস দেখতে কেমন?
data class Student(val name: String, val roll: Int)
যেহেতু ডেটা নিয়ে কাজ করার জন্য এটি তৈরি তাই এর প্রাইমারি কনস্ট্রাক্টরে কমপক্ষে একটি প্রোপার্টি প্যারামিটার val/var সহ দিতে হবে যাতে তার মধ্যে আমরা ডেটা রাখতে পারি।
ডেটা ক্লাসে ডিফল্টভাবেই নিচের ফাংশনগুলো রয়েছে, আলাদাকরে লিখতে হয় না তাই কোড কম লিখতে হয়:
equals()
hashCode()
toString()
copy()
component()
ডেটা ক্লাসে কি কি প্রয়োজন:
- কমপক্ষে ১টি প্যারামিটার সহ প্রাইমারি কনস্ট্রাক্টর।
- প্রাইমারি কনস্ট্রাক্টরের প্যারামিটারে var/val লিখতে হবে।
- ডেটা ক্লাস abstract, inner, open, sealed হতে পারবে না।
সাধারন ক্লাসের ক্ষেত্রে toString() ও equals() ফাংশনের ব্যবহার:
সাধারন কটলিন ক্লাস:
class MyCar2(var name: String, val id: Int)
সাধারন ক্লাসের স্ট্রিংয়ে কনভার্ট ও অন্য ক্লাসের সাথে তুলনা:
val mc1: MyCar2 = MyCar2("Touhid", 3)
val mc2: MyCar2 = MyCar2("Touhid", 3)
println(mc1.toString())
val r1: Boolean = mc1.equals(mc2)
println(r1)
আউটপুট হবে এমন:
com.touhidapps.helloWorld.MyCar2@2133c8f8
false
প্রথমে প্রিন্ট হয়েছে toString() এর ফলাফল যেটা অবজেক্টকে স্ট্রিংয়ে কনভার্ট করে ডাটা রিটার্ন না করে হ্যাশ কোড রিটার্ন করেছে।
equals() ফাংশনের মাধ্যমে false রিটার্ট করেছে যদিও একই রকম ডাটা দেয়া হয়েছে দুটি অবজেক্টে। সমস্য দুটি সমাধান করবে ডেটা ক্লাস।
একই রকমভাবে যদি ডেটা ক্লাসে toString() ও equals() ব্যবহার করা হতো তবে কি হতো সেটা দেখি:
ডেটা ক্লাস:
data class MyCar(var name: String, val id: Int)
ডেটা ক্লাসের স্ট্রিংয়ে কনভার্ট ও অন্য ডেটা ক্লাসের সাথে তুলনা:
val myCar: MyCar = MyCar("Touhid", 3)
val myCar2: MyCar = MyCar("Touhid", 3)
println(myCar.toString())
val r: Boolean = myCar.equals(myCar2)
println(r)
আউটপুট হবে এমন:
MyCar(name=Touhid, id=3)
true
দেখতে পাচ্ছি ডেটা প্রিন্ট হয়েছে toString() এর মাধ্যমে এবং true প্রিন্ট হয়েছে equals() ফাংশনের তুলনা করার ফলে যেহেতু একই ডেটা দিয়ে অবজেক্ট তৈরি হয়েছে।
copy() ফাংশনের ব্যবহার:
// copy() ফাংশন দিয়ে অবজেক্ট কপি/ক্লোন করা
val m: MyCar = myCar.copy()
// কনস্ট্রাক্টর সহ copy() ফাংশন
val m1: MyCar = myCar.copy("Touhidul Islam", 4)
এভাবে copy() ফাংশন ব্যবহার করে ইনস্টেন্স বা অবজেক্ট ক্লোন করে নতুন রেফারেন্সে নেয়া যায়। এখানে m এবং m1 রেফারেন্সে myCar রেফারেন্স থেকে ইনস্টেন্স ক্লোন করে নেয়া হলো। এখন m কিংবা m1, MyCar এর নতুন ইনস্টেন্স হিসেবে ব্যবহার করা যাবে।
এবার একটা জাভার উদাহরণ দেখি – যারা জাভা করেননি তাদের জন্য এই অংশটুকু ঐচ্ছিক:
import java.util.Objects;
class Main {
public static void main(String[] args) {
MyCar myCar = new MyCar("Touhid", 3);
System.out.println(myCar);
}
}
public class MyCar {
private String name;
private int id;
public MyCar(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyCar)) return false;
MyCar user = (MyCar) o;
return getId() == user.getId() &&
Objects.equals(getName(), user.getName());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getId());
}
@Override
public String toString() {
return "MyCar{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
এখানে MyCar দিয়ে ডেটা ক্লাস বানানো হয়েছে যেখানে ডেটা নিয়ে কাজ করা যাবে। এখানে কিছু ফাংশনও রয়েছে যেমন: toString() কল দিলে ডেটাগুলো প্রিন্ট হবে।
আউটপুট হবে এমন:
MyCar{name='Touhid', id=3}
এই জাভার ক্লাসকে যদি কটলিনে করা হয় তবে সেটা খুব সংক্ষেপে লেখা যাবে।
fun main() {
val myCar: MyCar = MyCar("Touhid", 3)
println(myCar)
}
data class MyCar(var name: String, val id: Int)
আউটপুট হবে এমন:
MyCar(name=Touhid, id=3)
কটলিনের ডেটা ক্লাসে জাভার তুলনায় অনেক কম কোড লিখতে হয়।
