data class Kotlin-এ একটি বিশেষ ধরনের ক্লাস যা শুধুমাত্র ডেটা সংরক্ষণের জন্য ডিজাইন করা হয়েছে। কম্পাইলার প্রাইমারি কনস্ট্রাক্টরে উল্লেখিত প্রপার্টির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে equals, hashCode, toString, copy এবং componentN মেথড জেনারেট করে। JetBrains ডকুমেন্টেশন (2026) অনুযায়ী, data class Java সমতুল্যের তুলনায় বয়লারপ্লেট কোডের পরিমাণ 50–70% কমাতে দেয় এবং Kotlin প্রকল্পে value-অবজেক্টের ভিত্তি।
মূল পয়েন্ট
data class হল Kotlin-এর একটি সিনট্যাক্টিক কনস্ট্রাক্ট যা স্বয়ংক্রিয়ভাবে সেই ক্লাসগুলির জন্য স্ট্যান্ডার্ড মেথড জেনারেট করে যাদের প্রধান উদ্দেশ্য ডেটা সংরক্ষণ করা। data class ঘোষণা করার সময়, কম্পাইলার প্রাইমারি কনস্ট্রাক্টরের সব প্রপার্টির উপর ভিত্তি করে equals, hashCode, toString, copy এবং componentN-এর ইমপ্লিমেন্টেশন তৈরি করে।
Java-তে সাধারণ ক্লাসের বিপরীতে, যেখানে ডেভেলপারকে IDE বা Lombok-এর মতো লাইব্রেরি ব্যবহার করে ম্যানুয়ালি গেটার, সেটার, equals, hashCode এবং toString লিখতে হয়, Kotlin একটি বিল্ট-ইন মেকানিজম প্রদান করে। এটি কেবল কোড কমায় না বরং ধারাবাহিকতাও নিশ্চিত করে — স্বয়ংক্রিয় মেথড সবসময় বর্তমান প্রপার্টি স্ট্রাকচারের সাথে সঙ্গতিপূর্ণ হয়।
JetBrains Kotlin জরিপ (2025) অনুযায়ী, 78% Kotlin প্রকল্পে data class ব্যবহৃত হয়, যা এটিকে ভাষার সবচেয়ে চাহিদাসম্পন্ন বৈশিষ্ট্যগুলির একটি করে তোলে। এটি বিশেষ করে DTO, API প্রতিক্রিয়া মডেল এবং MVVM-এ state-অবজেক্ট সহ আর্কিটেকচারে জনপ্রিয়।
data class class-এর আগে data কীওয়ার্ড দিয়ে ঘোষণা করা হয়। স্বয়ংক্রিয় মেথডে অংশগ্রহণকারী সব প্রপার্টি প্রাইমারি কনস্ট্রাক্টরে উল্লেখ করা হয়।
data class User(
val id: Int,
val name: String,
val email: String
)
কোডের একটি লাইন Java-তে ডজনখানেক বয়লারপ্লেট লাইন প্রতিস্থাপন করে। কম্পাইলার তিনটি প্রপার্টির জন্যই equals, hashCode, toString, copy এবং component1–component3 জেনারেট করে।
স্বয়ংক্রিয় মেথডে শুধুমাত্র প্রাইমারি কনস্ট্রাক্টরের প্রপার্টি অন্তর্ভুক্ত থাকে। যদি ক্লাসের বডিতে একটি প্রপার্টি ঘোষণা করা হয়, তবে তা equals, hashCode, toString এবং copy-তে অংশগ্রহণ করে না।
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
প্রাইমারি কনস্ট্রাক্টরে কমপক্ষে একটি প্যারামিটার থাকতে হবে। সব প্যারামিটার val বা var হিসেবে চিহ্নিত হতে হবে। data class-এর জন্য open, abstract, sealed বা inner মডিফায়ার ব্যবহার করা যাবে না।
equals এবং hashCode প্রাইমারি কনস্ট্রাক্টরের সব প্রপার্টির মানের উপর ভিত্তি করে জেনারেট হয়। data class-এর দুটি ইন্সট্যান্স সমান বিবেচিত হয় যদি তাদের সব অনুরূপ প্রপার্টি সমান হয়।
Java-তে, ডিফল্টরূপে অবজেক্ট তুলনা হল রেফারেন্স তুলনা (==)। মান তুলনার জন্য equals ওভাররাইড করা প্রয়োজন। Kotlin data class স্বয়ংক্রিয়ভাবে এটি করে, স্ট্রাকচারাল তুলনার জন্য == ব্যবহার করার অনুমতি দিয়ে।
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
toString মেথড সব প্রপার্টির নাম এবং মান সহ অবজেক্টের একটি পঠনযোগ্য উপস্থাপনা ফেরত দেয়। এটি Java-এর তুলনায় লগিং এবং ডিবাগিংকে উল্লেখযোগ্যভাবে সহজ করে, যেখানে ডিফল্ট আউটপুট হেক্সাডেসিমেল ফরম্যাটে হ্যাশ কোড দেখায়।
Kotlin ডকুমেন্টেশন (2026) অনুযায়ী, data class-এর toString ফরম্যাট: “User(id=1, name=John, email=john@example.com)”। প্রাইমারি কনস্ট্রাক্টর থেকে প্রপার্টি সরানোর সময় toString স্বয়ংক্রিয়ভাবে আপডেট হয় — ডিসিঙ্ক্রোনাইজেশনের ঝুঁকি দূর হয়।
copy data class-এর মূল বৈশিষ্ট্যগুলির একটি। এটি নির্দিষ্ট প্রপার্টির মান পরিবর্তনের সম্ভাবনা সহ অবজেক্টের একটি শ্যালো কপি তৈরি করে।
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"
copy ফাংশনাল স্টাইল এবং অপরিবর্তনীয়তা (immutability) সহ আর্কিটেকচারে অপরিহার্য। বিদ্যমান অবজেক্ট মিউটেট করার পরিবর্তে, পরিবর্তিত ফিল্ড সহ একটি নতুন কপি তৈরি করা হয়, যা কোডকে আরও অনুমানযোগ্য এবং মাল্টিথ্রেডেড পরিস্থিতিতে নিরাপদ করে।
data class স্বয়ংক্রিয়ভাবে প্রতিটি প্রপার্টির জন্য ঘোষণার ক্রম অনুসারে component1, component2 ইত্যাদি ফাংশন জেনারেট করে। এটি অবজেক্টকে ভেরিয়েবলে ডিস্ট্রাকচার করতে দেয়।
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
ডিস্ট্রাকচারিং ল্যাম্বডা এবং for-each লুপেও কাজ করে, যা data class-কে কালেকশনের সাথে কাজ করার জন্য সুবিধাজনক করে।
প্রথম সীমাবদ্ধতা — data class অন্য data class থেকে ইনহেরিটেন্স সমর্থন করে না। শুধুমাত্র সাধারণ ক্লাস বা ইন্টারফেস থেকে ইনহেরিট করা যেতে পারে।
দ্বিতীয় — স্বয়ংক্রিয় মেথডে শুধুমাত্র প্রাইমারি কনস্ট্রাক্টরের প্রপার্টি অন্তর্ভুক্ত থাকে। ক্লাসের বডির প্রপার্টি উপেক্ষা করা হয়, যা ভুল equals-এর কারণ হতে পারে যদি আপনি এটি ভুলে যান।
তৃতীয় — data class open, abstract, sealed বা inner হতে পারে না। এটি সবসময় final।
চতুর্থ — data class-এর ভিতরে কালেকশনের জন্য, copy শ্যালো কপি সম্পাদন করে। কপি করা কালেকশনের ভিতরে উপাদান পরিবর্তন করলে মূলকে প্রভাবিত করবে।
Kotlin সেরা অনুশীলন (2026) অনুযায়ী, data class DTO, API মডেল, value objects এবং state-অবজেক্টের জন্য সর্বোত্তম। ব্যবসায়িক লজিক সহ উপাদানের জন্য সাধারণ ক্লাস ব্যবহার করার পরামর্শ দেওয়া হয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
না, data class অন্য data class থেকে ইনহেরিট করতে পারে না। তবে এটি একটি সাধারণ ক্লাস থেকে ইনহেরিট করতে বা ইন্টারফেস ইমপ্লিমেন্ট করতে পারে।
কমপক্ষে একটি প্রপার্টি। সর্বোচ্চ সংখ্যা সীমাবদ্ধ নয়, তবে ডিস্ট্রাকচারিংয়ের জন্য componentN জেনারেট হয়।
না, স্বয়ংক্রিয় মেথড শুধুমাত্র প্রাইমারি কনস্ট্রাক্টরের প্রপার্টি বিবেচনা করে। ক্লাসের বডির প্রপার্টি equals, hashCode, toString এবং copy-তে অংশগ্রহণ করে না।
হ্যাঁ, আপনি data class-এর বডিতে equals, hashCode বা toString ওভাররাইড করতে পারেন। এই ক্ষেত্রে, কম্পাইলার নিজস্ব ইমপ্লিমেন্টেশন জেনারেট করে না।
data class স্বয়ংক্রিয়ভাবে equals, hashCode, toString, copy এবং componentN জেনারেট করে। সাধারণ ক্লাস ম্যানুয়াল ইমপ্লিমেন্টেশন ছাড়া এই মেথডগুলি প্রদান করে না।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন