Kotlin-এ data class — এটি কী, সিনট্যাক্স এবং ডেটা ক্লাসের বৈশিষ্ট্য

লেখক: IT Sectr প্রকাশিত: 2026-06-20 পড়ার সময়: 10 মিনিট

data class Kotlin-এ একটি বিশেষ ধরনের ক্লাস যা শুধুমাত্র ডেটা সংরক্ষণের জন্য ডিজাইন করা হয়েছে। কম্পাইলার প্রাইমারি কনস্ট্রাক্টরে উল্লেখিত প্রপার্টির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে equals, hashCode, toString, copy এবং componentN মেথড জেনারেট করে। JetBrains ডকুমেন্টেশন (2026) অনুযায়ী, data class Java সমতুল্যের তুলনায় বয়লারপ্লেট কোডের পরিমাণ 50–70% কমাতে দেয় এবং Kotlin প্রকল্পে value-অবজেক্টের ভিত্তি।

মূল পয়েন্ট

  • data — Kotlin-এ ডেটা ক্লাস ঘোষণার জন্য কীওয়ার্ড
  • equals এবং hashCode — প্রাইমারি কনস্ট্রাক্টরের সব প্রপার্টির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে জেনারেট হয়
  • copy — পৃথক ফিল্ড প্রতিস্থাপনের সম্ভাবনা সহ শ্যালো কপি ফাংশন
  • componentN — data class-কে পৃথক ভেরিয়েবলে ডিস্ট্রাকচার করা
  • প্রাইমারি কনস্ট্রাক্টরে কমপক্ষে একটি val বা var প্যারামিটার থাকতে হবে

Kotlin-এ data class কী?

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 কীওয়ার্ড দিয়ে ঘোষণা করা হয়। স্বয়ংক্রিয় মেথডে অংশগ্রহণকারী সব প্রপার্টি প্রাইমারি কনস্ট্রাক্টরে উল্লেখ করা হয়।

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

কোডের একটি লাইন Java-তে ডজনখানেক বয়লারপ্লেট লাইন প্রতিস্থাপন করে। কম্পাইলার তিনটি প্রপার্টির জন্যই equals, hashCode, toString, copy এবং component1–component3 জেনারেট করে।

প্রাইমারি কনস্ট্রাক্টরের বাইরের প্রপার্টি

স্বয়ংক্রিয় মেথডে শুধুমাত্র প্রাইমারি কনস্ট্রাক্টরের প্রপার্টি অন্তর্ভুক্ত থাকে। যদি ক্লাসের বডিতে একটি প্রপার্টি ঘোষণা করা হয়, তবে তা equals, hashCode, toString এবং copy-তে অংশগ্রহণ করে না।

kotlin
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 এবং toString

equals এবং hashCode প্রাইমারি কনস্ট্রাক্টরের সব প্রপার্টির মানের উপর ভিত্তি করে জেনারেট হয়। data class-এর দুটি ইন্সট্যান্স সমান বিবেচিত হয় যদি তাদের সব অনুরূপ প্রপার্টি সমান হয়।

মান তুলনার জন্য equals

Java-তে, ডিফল্টরূপে অবজেক্ট তুলনা হল রেফারেন্স তুলনা (==)। মান তুলনার জন্য equals ওভাররাইড করা প্রয়োজন। Kotlin data class স্বয়ংক্রিয়ভাবে এটি করে, স্ট্রাকচারাল তুলনার জন্য == ব্যবহার করার অনুমতি দিয়ে।

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

ডিবাগিংয়ের জন্য toString

toString মেথড সব প্রপার্টির নাম এবং মান সহ অবজেক্টের একটি পঠনযোগ্য উপস্থাপনা ফেরত দেয়। এটি Java-এর তুলনায় লগিং এবং ডিবাগিংকে উল্লেখযোগ্যভাবে সহজ করে, যেখানে ডিফল্ট আউটপুট হেক্সাডেসিমেল ফরম্যাটে হ্যাশ কোড দেখায়।

Kotlin ডকুমেন্টেশন (2026) অনুযায়ী, data class-এর toString ফরম্যাট: “User(id=1, name=John, email=john@example.com)”। প্রাইমারি কনস্ট্রাক্টর থেকে প্রপার্টি সরানোর সময় toString স্বয়ংক্রিয়ভাবে আপডেট হয় — ডিসিঙ্ক্রোনাইজেশনের ঝুঁকি দূর হয়।

copy ফাংশন এবং ডিস্ট্রাকচারিং

copy data class-এর মূল বৈশিষ্ট্যগুলির একটি। এটি নির্দিষ্ট প্রপার্টির মান পরিবর্তনের সম্ভাবনা সহ অবজেক্টের একটি শ্যালো কপি তৈরি করে।

kotlin
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) সহ আর্কিটেকচারে অপরিহার্য। বিদ্যমান অবজেক্ট মিউটেট করার পরিবর্তে, পরিবর্তিত ফিল্ড সহ একটি নতুন কপি তৈরি করা হয়, যা কোডকে আরও অনুমানযোগ্য এবং মাল্টিথ্রেডেড পরিস্থিতিতে নিরাপদ করে।

componentN-এর মাধ্যমে ডিস্ট্রাকচারিং

data class স্বয়ংক্রিয়ভাবে প্রতিটি প্রপার্টির জন্য ঘোষণার ক্রম অনুসারে component1, component2 ইত্যাদি ফাংশন জেনারেট করে। এটি অবজেক্টকে ভেরিয়েবলে ডিস্ট্রাকচার করতে দেয়।

kotlin
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 থেকে ইনহেরিট করতে পারে?

না, data class অন্য data class থেকে ইনহেরিট করতে পারে না। তবে এটি একটি সাধারণ ক্লাস থেকে ইনহেরিট করতে বা ইন্টারফেস ইমপ্লিমেন্ট করতে পারে।

প্রাইমারি কনস্ট্রাক্টরে কতগুলি প্রপার্টি থাকতে হবে?

কমপক্ষে একটি প্রপার্টি। সর্বোচ্চ সংখ্যা সীমাবদ্ধ নয়, তবে ডিস্ট্রাকচারিংয়ের জন্য componentN জেনারেট হয়।

ক্লাসের বডির প্রপার্টি কি equals-এ অন্তর্ভুক্ত হয়?

না, স্বয়ংক্রিয় মেথড শুধুমাত্র প্রাইমারি কনস্ট্রাক্টরের প্রপার্টি বিবেচনা করে। ক্লাসের বডির প্রপার্টি equals, hashCode, toString এবং copy-তে অংশগ্রহণ করে না।

আমি কি স্বয়ংক্রিয় মেথড ম্যানুয়ালি ওভাররাইড করতে পারি?

হ্যাঁ, আপনি data class-এর বডিতে equals, hashCode বা toString ওভাররাইড করতে পারেন। এই ক্ষেত্রে, কম্পাইলার নিজস্ব ইমপ্লিমেন্টেশন জেনারেট করে না।

data class সাধারণ ক্লাস থেকে কীভাবে আলাদা?

data class স্বয়ংক্রিয়ভাবে equals, hashCode, toString, copy এবং componentN জেনারেট করে। সাধারণ ক্লাস ম্যানুয়াল ইমপ্লিমেন্টেশন ছাড়া এই মেথডগুলি প্রদান করে না।

সারসংক্ষেপ

  • data class — স্বয়ংক্রিয়ভাবে জেনারেটেড মেথড সহ ডেটা সংরক্ষণের জন্য Kotlin সিনট্যাক্টিক কনস্ট্রাক্ট
  • equals এবং hashCode — প্রাইমারি কনস্ট্রাক্টর প্রপার্টির উপর ভিত্তি করে স্ট্রাকচারাল তুলনা
  • toString — ডিবাগিং এবং লগিংয়ের জন্য অবজেক্টের পঠনযোগ্য উপস্থাপনা
  • copy — নামযুক্ত আর্গুমেন্ট দ্বারা পৃথক ফিল্ড প্রতিস্থাপন সহ শ্যালো কপি
  • componentN — কালেকশনের সাথে সুবিধাজনক কাজের জন্য অবজেক্টের ভেরিয়েবলে ডিস্ট্রাকচারিং
  • সীমাবদ্ধতা — ডিফল্টরূপে final, কমপক্ষে একটি প্রপার্টি, কোন data->data ইনহেরিটেন্স নয়
  • ব্যবহার — DTO, API মডেল, value objects, MVVM-এ state

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন