Java একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা যা এক দশকেরও বেশি সময় ধরে Android SDK-এর প্রাথমিক ভাষা ছিল। Google-এর Kotlin-এ আনুষ্ঠানিক রূপান্তর সত্ত্বেও, Java ইকোসিস্টেমের একটি গুরুত্বপূর্ণ অংশ রয়ে গেছে: লিগ্যাসি প্রকল্প, এন্টারপ্রাইজ অ্যাপ্লিকেশন এবং Google Play-তে লক্ষ লক্ষ কোডের লাইন Java-তে কাজ চালিয়ে যাচ্ছে। JetBrains Developer Ecosystem রিপোর্ট (2025) অনুসারে, প্রায় 35% Android প্রকল্প এখনও Java ব্যবহার করে। বর্তমান প্রবণতা সম্পর্কে আরও জানতে অফিসিয়াল JetBrains রিপোর্ট পড়ুন।
মূল বিষয়বস্তু
Java একটি সাধারণ-উদ্দেশ্য প্রোগ্রামিং ভাষা যা Sun Microsystems 1995 সালে তৈরি করেছিল। মূল নীতি হল "Write Once, Run Anywhere": কম্পাইল করা Java বাইটকোড যেকোনো প্ল্যাটফর্মে চলে যেখানে JVM ভার্চুয়াল মেশিন ইনস্টল করা আছে। মোবাইল উন্নয়নের প্রেক্ষাপটে, Java 2008 সালে Google-এর প্রকাশিত Android SDK-এর প্রথম অফিসিয়াল ভাষা হয়ে ওঠে।
Java আর্কিটেকচার তিনটি উপাদানের উপর ভিত্তি করে: JDK (Java Development Kit) — ডেভেলপার টুলসের সেট, JRE (Java Runtime Environment) — রানটাইম পরিবেশ, এবং JVM (Java Virtual Machine) — ভার্চুয়াল মেশিন। Android তার নিজস্ব JVM বাস্তবায়ন — Android Runtime (ART) ব্যবহার করে, যা সংস্করণ 5.0 (Lollipop)-এ Dalvik-কে প্রতিস্থাপন করেছিল। ART DEX বাইটকোড নির্বাহ করে, যা dx/d8 ইউটিলিটির মাধ্যমে Java বাইটকোড থেকে কম্পাইল হয়।
Java-র একটি মূল বৈশিষ্ট্য হল Garbage Collector (GC)-এর মাধ্যমে স্বয়ংক্রিয় মেমরি ব্যবস্থাপনা। ডেভেলপারকে স্পষ্টভাবে মেমরি মুক্ত করার প্রয়োজন নেই — GC অব্যবহৃত অবজেক্ট ট্র্যাক করে এবং সেগুলি সরিয়ে দেয়। Android ART-তে, Concurrent Mark Sweep (CMS) এবং Generational GC ব্যবহার করা হয়, যা মোবাইল ডিভাইসের সীমিত সম্পদের জন্য অপ্টিমাইজ করা। এটি ডেভেলপারের বোঝা কমায়, কিন্তু UI থ্রেডে আবর্জনা সংগ্রহ করার সময় "ল্যাগ" সৃষ্টি করতে পারে।
Android Java API-র একটি উপসেট সমর্থন করে যা প্রতিটি নতুন OS সংস্করণের সাথে প্রসারিত হয়। Android 12 (API 31) Java 11-এর জন্য সমর্থন যোগ করেছে, যার মধ্যে ভেরিয়েবল ক্যাপচার সহ ল্যাম্বডা, JPMS মডিউল সিস্টেম এবং java.net.http HTTP ক্লায়েন্ট অন্তর্ভুক্ত। Android 14 (API 34) D8/R8 ডিসুগারিং-এর মাধ্যমে Java 17-এর জন্য পরীক্ষামূলক সমর্থন চালু করেছে — কিছু বৈশিষ্ট্য (records, sealed classes) পুরানো সংস্করণের জন্য সামঞ্জস্যপূর্ণ কোডে অনুবাদ করা হয়।
| Java সংস্করণ | Android API (min) | Android সংস্করণ | মূল বৈশিষ্ট্য |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | ল্যাম্বডা, Stream API, Optional |
| Java 11 | API 31 | 12 | HTTP Client, Local-Variable Syntax |
| Java 17 | API 34 | 14 | Records, Sealed Classes (D8) |
Android SDK-এর মধ্যে Java কম্পাইলার, dex ইউটিলিটি (d8), aapt (Asset Packaging Tool), এমুলেটর এবং android.* এবং java.* লাইব্রেরি অন্তর্ভুক্ত। ডেভেলপার Java-তে কোড লেখে, এটি .class ফাইল (JVM বাইটকোড)-এ কম্পাইল করে, তারপর d8 সেগুলিকে .dex ফাইল (Dalvik Executable)-এ রূপান্তর করে, যা রিসোর্স এবং AndroidManifest.xml-সহ APK-তে প্যাকেজ করা হয়।
Gradle হল Android প্রকল্প বিল্ড সিস্টেম। build.gradle (Groovy) বা build.gradle.kts (Kotlin DSL) ফাইল নির্ভরতা, SDK সংস্করণ, ফ্লেভার এবং স্বাক্ষর বর্ণনা করে। Android Gradle Plugin (AGP) সংস্করণ 8.x ডিসুগার স্বয়ংক্রিয় করে — আধুনিক Java বৈশিষ্ট্যের পশ্চাদমুখী-সামঞ্জস্যপূর্ণ কোডে অনুবাদ। উদাহরণস্বরূপ, java.time.LocalDate ডেভেলপারের সোর্সে পরিবর্তন ছাড়াই API 21+ সামঞ্জস্যপূর্ণ কোডে রূপান্তরিত হয়।
// Java-তে সরল Android Activity
package com.example.myapp;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.textView);
tv.setText("Hello from Java!");
}
// বাটন ক্লিক হ্যান্ডল করার মেথড
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("Button clicked");
}
}MainActivity ক্লাস AppCompatActivity-কে বাড়িয়ে তোলে — পশ্চাদমুখী সামঞ্জস্যের জন্য AndroidX-এর একটি বেস ক্লাস। onCreate মেথড Activity তৈরি হলে কল করা হয়, এতে setContentView-এর মাধ্যমে লেআউট সেট করা হয়। findViewById Java ভেরিয়েবলকে XML লেআউটের একটি উপাদানের সাথে সংযুক্ত করে। onButtonClick মেথড XML-এ android:onClick অ্যাট্রিবিউটের মাধ্যমে বাটনের সাথে আবদ্ধ।
Java-তে Activity জীবনচক্র হল কলব্যাকের একটি ক্রম: onCreate → onStart → onResume (সক্রিয়), onPause → onStop → onDestroy (সমাপ্তি)। ডেভেলপার রিসোর্স পরিচালনার জন্য এই মেথডগুলি ওভাররাইড করে। onCreate — আরম্ভীকরণ, onPause — ডেটা সংরক্ষণ, onDestroy — রিসোর্স মুক্ত করা। Android স্ক্রিন ঘোরানো, ব্যাকগ্রাউন্ডে যাওয়া এবং কল পাওয়ার সময় এই মেথডগুলি কল করে।
// অবস্থা ব্যবস্থাপনা সহ Activity জীবনচক্র
public class DetailActivity extends AppCompatActivity {
private String itemId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
itemId = getIntent().getStringExtra("ITEM_ID");
loadData(itemId);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("item_id", itemId);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
itemId = savedInstanceState.getString("item_id");
loadData(itemId);
}
private void loadData(String id) {
// আইডেন্টিফায়ার দ্বারা ডেটা লোড করা
}
}onSaveInstanceState মেথড স্ক্রিন ঘোরানো বা কাজ স্যুইচ করার সময় Activity-র অবস্থা সংরক্ষণ করে। Bundle-এ কী-মান জোড়া থাকে — সরল টাইপ, Parcelable বা Serializable অবজেক্ট। onRestoreInstanceState সংরক্ষিত অবস্থা পুনরুদ্ধার করে। এই প্যাটার্ন Android-এর জন্য গুরুত্বপূর্ণ, কারণ সিস্টেম মেমরি কম হলে Activity ধ্বংস করতে পারে এবং ব্যবহারকারী ফিরে আসলে পুনরুদ্ধার করতে পারে।
Java সিনট্যাক্স C-সদৃশ, কঠোরভাবে টাইপকৃত, অবজেক্ট-ওরিয়েন্টেড। প্রতিটি .java ফাইলে একটি public ক্লাস থাকে যার নাম ফাইলের নামের সাথে মেলে। Java ক্লাসের বাইরে ফাংশন সমর্থন করে না — সবকিছুই একটি মেথড। প্রবেশ বিন্দু হল কনসোল অ্যাপ্লিকেশনের জন্য স্ট্যাটিক মেথড public static void main(String[] args) বা মোবাইলের জন্য Android Activity জীবনচক্র মেথড।
Java টাইপগুলিকে প্রিমিটিভ (int, double, boolean, char, byte, short, long, float) এবং রেফারেন্স টাইপ (ক্লাস, ইন্টারফেস, অ্যারে, enum) এ ভাগ করে। প্রিমিটিভ স্ট্যাকে সংরক্ষিত হয় এবং মান দ্বারা পাস করা হয়। অবজেক্ট হিপে থাকে, রেফারেন্স দ্বারা পাস করা হয়। অটোবক্সিং স্বয়ংক্রিয়ভাবে প্রিমিটিভকে র্যাপার অবজেক্ট (Integer, Double, Boolean)-এ রূপান্তর করে, কিন্তু অতিরিক্ত অবজেক্ট তৈরি করে — Android-এ এটি UI পারফরম্যান্সের জন্য গুরুত্বপূর্ণ।
// Java ডেটা টাইপ এবং স্ট্রাকচারের উদাহরণ
public class DataTypes {
// প্রিমিটিভ
int count = 42;
double price = 19.99;
boolean isActive = true;
char grade = 'A';
// রেফারেন্স টাইপ
String name = "Android";
Integer boxed = 100; // autoboxing
List<String> items = new ArrayList<>();
// জেনেরিক্স সহ মেথড
public <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}
// মানের নির্দিষ্ট সেটের জন্য Enum
public enum Status {
PENDING, LOADING, SUCCESS, ERROR
}
}জেনেরিক্স List<T> কালেকশনের জন্য টাইপ নিরাপত্তা প্রদান করে। getFirst মেথড যেকোনো টাইপের উপাদান ফেরত দেয় — নির্দিষ্ট টাইপ কল সাইটে নির্ধারিত হয়। Enum Status ধ্রুবকের একটি নির্দিষ্ট সেট সহ একটি ক্লাসে কম্পাইল হয়, প্রতিটি ইনস্ট্যান্স একটি সিংলটন। Android-এ, মেমরি খরচের কারণে enum কম ব্যবহৃত হয়: ProGuard/R8 যেখানে সম্ভব enum-কে int ধ্রুবকে অপ্টিমাইজ করে।
Java এবং Kotlin-এর তুলনা Android উন্নয়নের জন্য 2019 সাল থেকে প্রধান বিষয়গুলির মধ্যে একটি, যখন Google Kotlin-কে অগ্রাধিকার ভাষা ঘোষণা করেছিল। Kotlin Java-র সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ — উভয়ই JVM বাইটকোডে কম্পাইল হয়, একে অপরকে কল করতে পারে এবং একই লাইব্রেরি ব্যবহার করতে পারে। তবে কোড লেখার পদ্ধতি নাটকীয়ভাবে ভিন্ন।
Kotlin Java-র ভার্বোসিটি দূর করে: data class গেটার, সেটার, equals, hashCode, toString এবং copy সহ Java ক্লাসের 50+ লাইন প্রতিস্থাপন করে। নাল নিরাপত্তা Kotlin-এর টাইপ সিস্টেমে নির্মিত — NullPointerException কার্যত অসম্ভব। এক্সটেনশন ফাংশন ইনহেরিটেন্স ছাড়াই বিদ্যমান ক্লাসে মেথড যোগ করার অনুমতি দেয়। Smart Casts চেক করার পরে স্বয়ংক্রিয়ভাবে টাইপ রূপান্তর করে।
| দিক | Java | Kotlin |
|---|---|---|
| নাল নিরাপত্তা | @Nullable / @NonNull অ্যানোটেশন | String? / String — নির্মিত |
| Data class | Lombok-সহ 50+ লাইন | data class User(val name: String) |
| এক্সটেনশন | স্ট্যাটিক ইউটিলিটি ক্লাস | fun String.isEmail(): Boolean |
| Coroutines | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| ল্যাম্বডা | FunctionalInterface + ::method | ডিফল্টভাবে ল্যাম্বডা |
| DI অ্যানোটেশন | @Inject, @Module, @Provides | অনুরূপ, কিন্তু কম কোড |
পারফরম্যান্সের দিক থেকে, Java এবং Kotlin অভিন্ন — উভয়ই JVM বাইটকোডে কম্পাইল হয়, যা Android ART একইভাবে নির্বাহ করে। পার্থক্য APK আকারে: Kotlin kotlin-stdlib লাইব্রেরির জন্য ~200-400 KB যোগ করে। Java প্রকল্পে অতিরিক্ত রানটাইমের অনুপস্থিতির কারণে APK আকার ছোট হয়, কিন্তু Java Stream API এবং Optional ব্যবহার করার সময়, ডিসুগারিং-এর কারণে APK আকার বাড়তে পারে।
Android-এর জন্য Java ডেভেলপার টুলস-এর মধ্যে Android Studio, Gradle, প্রোফাইলার এবং এমুলেটর অন্তর্ভুক্ত। Android Studio হল অফিসিয়াল IDE, যা IntelliJ IDEA Community-এর উপর ভিত্তি করে, এতে Java অটোকমপ্লিট সহ এডিটর, কোড বিশ্লেষক (lint), রিফ্যাক্টরিং এবং ভিজ্যুয়াল লেআউট এডিটর (Layout Editor) অন্তর্ভুক্ত।
Android Gradle Plugin (AGP) সংস্করণ 8.x বিল্ড পরিচালনা করে: ক্লাসে Java কম্পাইলেশন, ডিসুগারিং, ProGuard/R8 মিনিফিকেশন, APK/AAB-তে প্যাকেজিং। R8 একটি আপডেটেড ডিসুগারিং এবং অবফাসকেটর, যা ProGuard-কে প্রতিস্থাপন করে। বিল্ড ভেরিয়েন্ট (debug/release + product flavors) build.gradle-এর মাধ্যমে কনফিগার করা হয়। Gradle Daemon ক্যাশিংয়ের মাধ্যমে পরবর্তী বিল্ড দ্রুত করে।
// build.gradle (app) — Java মডিউল কনফিগারেশন
android {
compileSdk 34
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
testImplementation 'junit:junit:4.13.2'
}compileOptions ব্লক কম্পাইলেশনের জন্য Java সংস্করণ নির্দিষ্ট করে — Java 17 AGP 8.x-এর সাথে উপলব্ধ। ন্যূনতম SDK (minSdk) ন্যূনতম Android সংস্করণ নির্ধারণ করে যেখানে অ্যাপ্লিকেশন চলে। Target SDK হল সংস্করণ যার জন্য অ্যাপ্লিকেশন পরীক্ষা করা হয়েছিল। compileSdk এবং targetSdk-এর মধ্যে পার্থক্য: compileSdk কম্পাইলেশনের জন্য API, targetSdk রানটাইম আচরণ।
Android-এ Java-র সীমাবদ্ধতা Google-কে Kotlin-এ রূপান্তরিত করতে পরিচালিত করেছিল। NullPointerException হল Java Android অ্যাপ্লিকেশনে সবচেয়ে সাধারণ ব্যতিক্রম, কারণ টাইপ সিস্টেম nullable এবং non-null রেফারেন্সের মধ্যে পার্থক্য করে না। Google androidx.annotation প্যাকেজ থেকে @Nullable এবং @NonNull অ্যানোটেশন সুপারিশ করে, কিন্তু কম্পাইলার সেগুলি পরীক্ষা করে না — শুধু lint করে।
Coroutines-এর অনুপস্থিতি আরেকটি সীমাবদ্ধতা: Java-তে অ্যাসিঙ্ক্রোনাস অপারেশনের জন্য কলব্যাক, AsyncTask (API 30 থেকে অবচিত), ExecutorService বা RxJava প্রয়োজন। এটি কলব্যাক হেল এবং স্ক্রিন ঘোরানোর সময় মেমরি লিকের দিকে নিয়ে যায়। Structured Concurrency-সহ Kotlin coroutines ভাষা স্তরে এই সমস্যার সমাধান করে: ম্যানুয়াল ব্যবস্থাপনা ছাড়াই Activity ধ্বংস হলে coroutine বাতিল হয়।
Java-তে বয়লারপ্লেট কোড ম্যানুয়ালি equals/hashCode, Parcelable বাস্তবায়ন এবং RecyclerView-এর জন্য ViewHolder লেখার সময় ত্রুটির উৎস। Android KTX লাইব্রেরি এবং Jetpack Compose Kotlin-এর দিকে ভিত্তিক। নতুন Android API (Room, Navigation, Compose) ডিফল্টভাবে Kotlin-এ উদাহরণ প্রকাশ করে, যদিও Java সংস্করণ বিদ্যমান।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Java Sun Microsystems (1995)-এর একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা, যা JVM ভার্চুয়াল মেশিনে চলে। 2019 পর্যন্ত Android SDK-এর প্রাথমিক ভাষা ছিল। এটি মোবাইল উন্নয়নে লিগ্যাসি প্রকল্প, সার্ভার-সাইড (Spring) এবং এন্টারপ্রাইজ অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। এটি কঠোর টাইপিং, স্বয়ংক্রিয় আবর্জনা সংগ্রহ এবং বাইটকোডের ক্রস-প্ল্যাটফর্ম ক্ষমতা দ্বারা বৈশিষ্ট্যযুক্ত।
Google 2019 সালে Kotlin-কে Android-এর জন্য অগ্রাধিকার ভাষা ঘোষণা করেছিল। নতুন AndroidX লাইব্রেরি, Jetpack Compose, আর্কিটেকচার সুপারিশ এবং ডকুমেন্টেশন ডিফল্টভাবে Kotlin-এ দেওয়া হয়। Java সম্পূর্ণ সমর্থিত থাকে, কিন্তু APIগুলি Kotlin-first পদ্ধতিতে ডিজাইন করা হয়। Java প্রকল্পগুলিতে আরও বয়লারপ্লেট কোড প্রয়োজন এবং নতুন ভাষা বৈশিষ্ট্যগুলি প্রথমে পায় না।
Android সম্পূর্ণরূপে Java 8 সমর্থন করে, Java 11 আংশিকভাবে Android 12+ থেকে, এবং Java 17 পরীক্ষামূলকভাবে D8 ডিসুগারিং-এর মাধ্যমে। Android Gradle Plugin (AGP) 8.x আধুনিক বাইটকোডকে desugar-এর মাধ্যমে পুরানো API-র জন্য সামঞ্জস্যপূর্ণ কোডে অনুবাদ করে। ডেভেলপার Java 11+-এ লিখতে পারে, ল্যাম্বডা, Optional এবং DateTime API ব্যবহার করতে পারে, কিন্তু records এবং sealed classes শুধুমাত্র D8-এর মাধ্যমে উপলব্ধ।
Kotlin-এর কম কোড প্রয়োজন: data class Java বয়লারপ্লেটের ডজন ডজন লাইন প্রতিস্থাপন করে, নাল নিরাপত্তা টাইপে নির্মিত, coroutines অ্যাসিঙ্ক্রোনাসিটি সহজ করে। Java নতুনদের জন্য সহজ সিনট্যাক্স, একটি প্রমাণিত লাইব্রেরি ইকোসিস্টেম এবং স্থিতিশীল টুলিং অফার করে। রানটাইম পারফরম্যান্স অভিন্ন — উভয়ই Android ART দ্বারা নির্বাহিত JVM বাইটকোডে কম্পাইল হয়।
Android Studio Java এবং Kotlin সমর্থন সহ Android উন্নয়নের জন্য মানক IDE। এতে এমুলেটর, প্রোফাইলার (CPU, memory, network), Layout Inspector, APK Analyzer অন্তর্ভুক্ত। IntelliJ IDEA সার্ভার Java-র জন্য উপযুক্ত। Eclipse ADT অবচিত এবং Google দ্বারা সমর্থিত নয়। Android Studio বিল্ট-ইন কনভার্টারের মাধ্যমে Java কোড Kotlin-এ মাইগ্রেট করার জন্য টুলসও সরবরাহ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন