Skill

জাভা জেনেরিক্স (Java Generics)

449

Java Generics হলো Java এর একটি শক্তিশালী বৈশিষ্ট্য যা টাইপ সুরক্ষা এবং কোডের পুনরায় ব্যবহারযোগ্যতা উন্নত করার জন্য ডিজাইন করা হয়েছে। এটি ডেভেলপারদের একটি ক্লাস, ইন্টারফেস, বা মেথড তৈরি করার সময় টাইপ প্যারামিটার ব্যবহার করার সুযোগ দেয়, যা রানটাইমের পরিবর্তে কম্পাইল টাইমে টাইপ চেক করতে সহায়ক। Generics এর মাধ্যমে কোড লেখা সহজ হয় এবং টাইপ সম্পর্কিত ত্রুটি কমে যায়।


Java Generics: একটি বিস্তারিত বাংলা টিউটোরিয়াল

ভূমিকা

Java Generics হলো একটি শক্তিশালী ফিচার, যা Java 5 থেকে পরিচিত করা হয়েছে। Generics এর মূল উদ্দেশ্য হলো type safety এবং code reusability নিশ্চিত করা। Generics ব্যবহার করে আপনি type parameters নির্দিষ্ট করতে পারেন, যা ডেভেলপারদের একাধিক ডেটা টাইপের সাথে কাজ করার জন্য একটি generic class, method, বা interface তৈরি করতে সাহায্য করে।

Generics আপনাকে compile-time type checking করতে দেয়, যার মাধ্যমে আপনি একধরনের ডেটা টাইপের সঙ্গে অন্য ডেটা টাইপ মিশ্রিত করতে পারবেন না। এর ফলে runtime exceptions এর সম্ভাবনা কমে যায়।

Generics এর উপকারিতা

  1. Type Safety: Generics ব্যবহার করে, আপনি কম্পাইল টাইমে টাইপ যাচাই করতে পারেন, যা ভুল টাইপের ডেটা ব্যবহার করা থেকে রক্ষা করে।
  2. Code Reusability: একবার একটি generic class বা method লিখে তা বিভিন্ন ডেটা টাইপের সঙ্গে ব্যবহার করা যায়, যার ফলে কোড পুনরায় লেখার প্রয়োজন হয় না।
  3. Runtime Errors কমে: Generics কম্পাইল টাইমে টাইপ যাচাই করে, ফলে runtime errors এর সংখ্যা কমে যায়।
  4. Readable এবং Maintainable কোড: Generics ব্যবহার করলে কোডের readability এবং maintainability বাড়ে।

Generics Syntax

Generics এর সাথে টাইপ প্যারামিটার যোগ করার জন্য angle brackets (<>) ব্যবহার করা হয়। সাধারণত, Generics এর ক্ষেত্রে এই টাইপ প্যারামিটারগুলো ব্যবহার করা হয়:

  • T: Type
  • E: Element
  • K: Key
  • V: Value
  • N: Number

Java Generics উদাহরণসমূহ

১. Generic Class

Generics ব্যবহার করে আপনি একটি generic class তৈরি করতে পারেন, যা একাধিক টাইপের ডেটা নিয়ে কাজ করতে সক্ষম।

// Generic ক্লাস যা T টাইপের ডেটা গ্রহণ করে
class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class GenericClassExample {
    public static void main(String[] args) {
        // String টাইপের জন্য Box তৈরি করা
        Box<String> stringBox = new Box<>();
        stringBox.setValue("Hello, Generics");
        System.out.println("String Box Value: " + stringBox.getValue());

        // Integer টাইপের জন্য Box তৈরি করা
        Box<Integer> integerBox = new Box<>();
        integerBox.setValue(123);
        System.out.println("Integer Box Value: " + integerBox.getValue());
    }
}

এই উদাহরণে, Box নামে একটি generic class তৈরি করা হয়েছে, যা যেকোনো টাইপের ডেটা রাখতে সক্ষম। এখানে আমরা String এবং Integer টাইপের জন্য আলাদা দুটি Box তৈরি করেছি।

আউটপুট:

String Box Value: Hello, Generics
Integer Box Value: 123

২. Generic Method

Generics শুধুমাত্র class নয়, method-এর জন্যও ব্যবহার করা যায়। নিচে একটি generic method এর উদাহরণ দেওয়া হলো:

public class GenericMethodExample {

    // Generic মেথড যা যেকোনো টাইপের ডেটা প্রিন্ট করতে সক্ষম
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        // String অ্যারে প্রিন্ট করা
        String[] stringArray = {"Apple", "Banana", "Mango"};
        printArray(stringArray);

        // Integer অ্যারে প্রিন্ট করা
        Integer[] intArray = {1, 2, 3, 4, 5};
        printArray(intArray);
    }
}

উপরের উদাহরণে, printArray নামে একটি generic method তৈরি করা হয়েছে, যা যেকোনো টাইপের অ্যারে প্রিন্ট করতে সক্ষম।

আউটপুট:

Copy code

Apple
Banana
Mango
1
2
3
4
5

৩. Bounded Type Parameter

কখনও কখনও আপনি চান যে একটি টাইপ প্যারামিটার শুধুমাত্র নির্দিষ্ট একটি টাইপ বা তার সাবটাইপ হতে পারবে। এ ক্ষেত্রে bounded type parameter ব্যবহার করা হয়।

// Bounded টাইপের জন্য Generic ক্লাস
class NumberBox<T extends Number> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class BoundedTypeExample {
    public static void main(String[] args) {
        // শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
        NumberBox<Integer> integerBox = new NumberBox<>();
        integerBox.setValue(10);
        System.out.println("Integer Value: " + integerBox.getValue());

        NumberBox<Double> doubleBox = new NumberBox<>();
        doubleBox.setValue(5.5);
        System.out.println("Double Value: " + doubleBox.getValue());

        // NumberBox<String> stringBox = new NumberBox<>(); // এটি কম্পাইল হবে না, কারণ String Number এর সাবক্লাস নয়।
    }
}

উপরের উদাহরণে, NumberBox ক্লাসটি শুধুমাত্র Number এর সাবটাইপগুলো (যেমন Integer, Double) গ্রহণ করবে। String টাইপ গ্রহণ করলে এটি কম্পাইল হবে না।

আউটপুট:

Integer Value: 10
Double Value: 5.5

৪. Wildcards in Generics

Generics এ wildcards ব্যবহার করে আপনি জেনেরিক টাইপের আরো ফ্লেক্সিবিলিটি পেতে পারেন। Wildcards সাধারণত ? দিয়ে চিহ্নিত করা হয়।

Unbounded Wildcard (<?>):

public class WildcardExample {

    // Unbounded Wildcard ব্যবহার করে যেকোনো টাইপের লিস্ট প্রিন্ট করা যায়
    public static void printList(List<?> list) {
        for (Object element : list) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("Apple", "Banana", "Mango");
        List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);

        printList(stringList);
        printList(intList);
    }
}

উপরের উদাহরণে, <?> ব্যবহার করে আমরা যেকোনো টাইপের লিস্ট প্রিন্ট করতে পারছি।

আউটপুট:

Apple
Banana
Mango
1
2
3
4
5

Upper Bounded Wildcard (<? extends Type>):

import java.util.List;

public class UpperBoundedWildcardExample {

    // Upper Bounded Wildcard যা শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
    public static void printNumbers(List<? extends Number> list) {
        for (Number number : list) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(1, 2, 3);
        List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);

        printNumbers(intList);
        printNumbers(doubleList);
    }
}

এই উদাহরণে, <? extends Number> ব্যবহার করে শুধুমাত্র Number এর সাবটাইপগুলোকে প্রিন্ট করা হচ্ছে।

আউটপুট:

1
2
3
1.1
2.2
3.3

Lower Bounded Wildcard (<? super Type>):

import java.util.List;
import java.util.ArrayList;

public class LowerBoundedWildcardExample {

    // Lower Bounded Wildcard যা শুধুমাত্র Integer এবং এর সুপারটাইপ গ্রহণ করে
    public static void addNumbers(List<? super Integer> list) {
        for (int i = 1; i <= 5; i++) {
            list.add(i);
        }
    }

    public static void main(String[] args) {
        List<Number> numberList = new ArrayList<>();
        addNumbers(numberList);
        System.out.println(numberList);
    }
}

এই উদাহরণে, <? super Integer> ব্যবহার করে শুধুমাত্র Integer এবং তার সুপারক্লাসের টাইপের জন্য কাজ করা হয়েছে।

আউটপুট:

[1, 2, 3, 4, 5]

উপসংহার

Java Generics ডেভেলপারদের জন্য টাইপ সেফ কোড লিখতে সহায়তা করে এবং একই কোডকে বিভিন্ন টাইপের ডেটার জন্য পুনর্ব্যবহারযোগ্য করে তোলে। Generics ব্যবহার করলে runtime errors এর সম্ভাবনা কমে যায় এবং কোডের রিডেবিলিটি ও মেইনটেনেন্স বাড়ে। Generics এর মাধ্যমে ডেভেলপাররা একটি ক্লাস বা মেথড একাধিক টাইপের জন্য ব্যবহার করতে পারেন, যার ফলে কোড আরও কার্যকর এবং সংক্ষিপ্ত হয়।

Java Generics হলো Java এর একটি শক্তিশালী বৈশিষ্ট্য যা টাইপ সুরক্ষা এবং কোডের পুনরায় ব্যবহারযোগ্যতা উন্নত করার জন্য ডিজাইন করা হয়েছে। এটি ডেভেলপারদের একটি ক্লাস, ইন্টারফেস, বা মেথড তৈরি করার সময় টাইপ প্যারামিটার ব্যবহার করার সুযোগ দেয়, যা রানটাইমের পরিবর্তে কম্পাইল টাইমে টাইপ চেক করতে সহায়ক। Generics এর মাধ্যমে কোড লেখা সহজ হয় এবং টাইপ সম্পর্কিত ত্রুটি কমে যায়।


Java Generics: একটি বিস্তারিত বাংলা টিউটোরিয়াল

ভূমিকা

Java Generics হলো একটি শক্তিশালী ফিচার, যা Java 5 থেকে পরিচিত করা হয়েছে। Generics এর মূল উদ্দেশ্য হলো type safety এবং code reusability নিশ্চিত করা। Generics ব্যবহার করে আপনি type parameters নির্দিষ্ট করতে পারেন, যা ডেভেলপারদের একাধিক ডেটা টাইপের সাথে কাজ করার জন্য একটি generic class, method, বা interface তৈরি করতে সাহায্য করে।

Generics আপনাকে compile-time type checking করতে দেয়, যার মাধ্যমে আপনি একধরনের ডেটা টাইপের সঙ্গে অন্য ডেটা টাইপ মিশ্রিত করতে পারবেন না। এর ফলে runtime exceptions এর সম্ভাবনা কমে যায়।

Generics এর উপকারিতা

  1. Type Safety: Generics ব্যবহার করে, আপনি কম্পাইল টাইমে টাইপ যাচাই করতে পারেন, যা ভুল টাইপের ডেটা ব্যবহার করা থেকে রক্ষা করে।
  2. Code Reusability: একবার একটি generic class বা method লিখে তা বিভিন্ন ডেটা টাইপের সঙ্গে ব্যবহার করা যায়, যার ফলে কোড পুনরায় লেখার প্রয়োজন হয় না।
  3. Runtime Errors কমে: Generics কম্পাইল টাইমে টাইপ যাচাই করে, ফলে runtime errors এর সংখ্যা কমে যায়।
  4. Readable এবং Maintainable কোড: Generics ব্যবহার করলে কোডের readability এবং maintainability বাড়ে।

Generics Syntax

Generics এর সাথে টাইপ প্যারামিটার যোগ করার জন্য angle brackets (<>) ব্যবহার করা হয়। সাধারণত, Generics এর ক্ষেত্রে এই টাইপ প্যারামিটারগুলো ব্যবহার করা হয়:

  • T: Type
  • E: Element
  • K: Key
  • V: Value
  • N: Number

Java Generics উদাহরণসমূহ

১. Generic Class

Generics ব্যবহার করে আপনি একটি generic class তৈরি করতে পারেন, যা একাধিক টাইপের ডেটা নিয়ে কাজ করতে সক্ষম।

// Generic ক্লাস যা T টাইপের ডেটা গ্রহণ করে
class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class GenericClassExample {
    public static void main(String[] args) {
        // String টাইপের জন্য Box তৈরি করা
        Box<String> stringBox = new Box<>();
        stringBox.setValue("Hello, Generics");
        System.out.println("String Box Value: " + stringBox.getValue());

        // Integer টাইপের জন্য Box তৈরি করা
        Box<Integer> integerBox = new Box<>();
        integerBox.setValue(123);
        System.out.println("Integer Box Value: " + integerBox.getValue());
    }
}

এই উদাহরণে, Box নামে একটি generic class তৈরি করা হয়েছে, যা যেকোনো টাইপের ডেটা রাখতে সক্ষম। এখানে আমরা String এবং Integer টাইপের জন্য আলাদা দুটি Box তৈরি করেছি।

আউটপুট:

String Box Value: Hello, Generics
Integer Box Value: 123

২. Generic Method

Generics শুধুমাত্র class নয়, method-এর জন্যও ব্যবহার করা যায়। নিচে একটি generic method এর উদাহরণ দেওয়া হলো:

public class GenericMethodExample {

    // Generic মেথড যা যেকোনো টাইপের ডেটা প্রিন্ট করতে সক্ষম
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        // String অ্যারে প্রিন্ট করা
        String[] stringArray = {"Apple", "Banana", "Mango"};
        printArray(stringArray);

        // Integer অ্যারে প্রিন্ট করা
        Integer[] intArray = {1, 2, 3, 4, 5};
        printArray(intArray);
    }
}

উপরের উদাহরণে, printArray নামে একটি generic method তৈরি করা হয়েছে, যা যেকোনো টাইপের অ্যারে প্রিন্ট করতে সক্ষম।

আউটপুট:

Copy code

Apple
Banana
Mango
1
2
3
4
5

৩. Bounded Type Parameter

কখনও কখনও আপনি চান যে একটি টাইপ প্যারামিটার শুধুমাত্র নির্দিষ্ট একটি টাইপ বা তার সাবটাইপ হতে পারবে। এ ক্ষেত্রে bounded type parameter ব্যবহার করা হয়।

// Bounded টাইপের জন্য Generic ক্লাস
class NumberBox<T extends Number> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class BoundedTypeExample {
    public static void main(String[] args) {
        // শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
        NumberBox<Integer> integerBox = new NumberBox<>();
        integerBox.setValue(10);
        System.out.println("Integer Value: " + integerBox.getValue());

        NumberBox<Double> doubleBox = new NumberBox<>();
        doubleBox.setValue(5.5);
        System.out.println("Double Value: " + doubleBox.getValue());

        // NumberBox<String> stringBox = new NumberBox<>(); // এটি কম্পাইল হবে না, কারণ String Number এর সাবক্লাস নয়।
    }
}

উপরের উদাহরণে, NumberBox ক্লাসটি শুধুমাত্র Number এর সাবটাইপগুলো (যেমন Integer, Double) গ্রহণ করবে। String টাইপ গ্রহণ করলে এটি কম্পাইল হবে না।

আউটপুট:

Integer Value: 10
Double Value: 5.5

৪. Wildcards in Generics

Generics এ wildcards ব্যবহার করে আপনি জেনেরিক টাইপের আরো ফ্লেক্সিবিলিটি পেতে পারেন। Wildcards সাধারণত ? দিয়ে চিহ্নিত করা হয়।

Unbounded Wildcard (<?>):

public class WildcardExample {

    // Unbounded Wildcard ব্যবহার করে যেকোনো টাইপের লিস্ট প্রিন্ট করা যায়
    public static void printList(List<?> list) {
        for (Object element : list) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("Apple", "Banana", "Mango");
        List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);

        printList(stringList);
        printList(intList);
    }
}

উপরের উদাহরণে, <?> ব্যবহার করে আমরা যেকোনো টাইপের লিস্ট প্রিন্ট করতে পারছি।

আউটপুট:

Apple
Banana
Mango
1
2
3
4
5

Upper Bounded Wildcard (<? extends Type>):

import java.util.List;

public class UpperBoundedWildcardExample {

    // Upper Bounded Wildcard যা শুধুমাত্র Number এর সাবটাইপ গ্রহণ করে
    public static void printNumbers(List<? extends Number> list) {
        for (Number number : list) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(1, 2, 3);
        List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);

        printNumbers(intList);
        printNumbers(doubleList);
    }
}

এই উদাহরণে, <? extends Number> ব্যবহার করে শুধুমাত্র Number এর সাবটাইপগুলোকে প্রিন্ট করা হচ্ছে।

আউটপুট:

1
2
3
1.1
2.2
3.3

Lower Bounded Wildcard (<? super Type>):

import java.util.List;
import java.util.ArrayList;

public class LowerBoundedWildcardExample {

    // Lower Bounded Wildcard যা শুধুমাত্র Integer এবং এর সুপারটাইপ গ্রহণ করে
    public static void addNumbers(List<? super Integer> list) {
        for (int i = 1; i <= 5; i++) {
            list.add(i);
        }
    }

    public static void main(String[] args) {
        List<Number> numberList = new ArrayList<>();
        addNumbers(numberList);
        System.out.println(numberList);
    }
}

এই উদাহরণে, <? super Integer> ব্যবহার করে শুধুমাত্র Integer এবং তার সুপারক্লাসের টাইপের জন্য কাজ করা হয়েছে।

আউটপুট:

[1, 2, 3, 4, 5]

উপসংহার

Java Generics ডেভেলপারদের জন্য টাইপ সেফ কোড লিখতে সহায়তা করে এবং একই কোডকে বিভিন্ন টাইপের ডেটার জন্য পুনর্ব্যবহারযোগ্য করে তোলে। Generics ব্যবহার করলে runtime errors এর সম্ভাবনা কমে যায় এবং কোডের রিডেবিলিটি ও মেইনটেনেন্স বাড়ে। Generics এর মাধ্যমে ডেভেলপাররা একটি ক্লাস বা মেথড একাধিক টাইপের জন্য ব্যবহার করতে পারেন, যার ফলে কোড আরও কার্যকর এবং সংক্ষিপ্ত হয়।

Promotion

Are you sure to start over?

Loading...