কম্পিউটার টিউটোরিয়াল

জাভা কেন স্ট্যাটিক ফাইনাল ভেরিয়েবল কনস্ট্রাক্টরে ইনিশিয়ালাইজ করার অনুমতি দেয় না?

যদি একটি ভেরিয়েবল static এবং final দুটি একসাথে ঘোষিত করা থাকে, তবে সেটি অবশ্যই ডিক্লেরেশনের সময় বা একটি static ব্লকে ইনিশিয়ালাইজ করতে হবে। কনস্ট্রাক্টরে ইনিশিয়ালাইজ করার চেষ্টা করলে কম্পাইলার মনে করে আপনি ফাইনাল ভেরিয়েবলে دوبারা মান অ্যাসাইন করার চেষ্টা করছেন এবং কম্পাইল টাইম এরর দেখায়।

উদাহরণ: কনস্ট্রাক্টরে ইনিশিয়ালাইজেশন (এরর)

class Data {
    static final int num;
    Data(int i) {
        num = i; // কম্পাইল এরর
    }
}

public class ConstantsExample {
    public static void main(String args[]) {
        System.out.println("value of the constant: " + Data.num);
    }
}

কম্পাইল টাইম এরর

ConstantsExample.java:4: error: cannot assign a value to final variable num
    num = i;
    ^
1 error

কারণ: স্ট্যাটিক ভেরিয়েবল ক্লাস লোড হওয়ার সময় মেমোরিতে এলোকেট হয়, কিন্তু কনস্ট্রাক্টর অবজেক্ট তৈরি হলে কল হয়। যদি একাধিক অবজেক্ট তৈরি করা হয়, তবে কনস্ট্রাক্টর একাধিকবার কল হবে এবং final ভেরিয়েবলে একাধিকবার মান অ্যাসাইন করার চেষ্টা হবে, যা final এর নিয়ম লঙ্ঘন।

সঠিক সমাধান: স্ট্যাটিক ব্লকে ইনিশিয়ালাইজেশন

class Data {
    static final int num;
    static {
        num = 1000; // সঠিক জায়গা
    }
}

public class ConstantsExample {
    public static void main(String args[]) {
        System.out.println("value of the constant: " + Data.num);
    }
}

আউটপুট

value of the constant: 1000

সারসংক্ষেপ: static final ভেরিয়েবল (কনস্ট্যান্ট) ইনিশিয়ালাইজ করতে হবে —

  1. ডিক্লেরেশনের সময়: static final int NUM = 100;
  2. বা স্ট্যাটিক ব্লকে: static { NUM = 100; }

কনস্ট্রাক্টরে বা ইনস্ট্যান্স ব্লকে ইনিশিয়ালাইজ করা যাবে না।

  1. জাভাতে ইন্টারফেস ভেরিয়েবল ডিফল্টভাবে static এবং final কেন

  2. জাভাতে ব্ল্যাঙ্ক ফাইনাল ভেরিয়েবল ইনিশিয়ালাইজ করা যায় কি

  3. জাভাতে কনস্ট্রাক্টর ফাইনাল হতে পারে না কেন

  4. জাভাতে ফাইনাল ভেরিয়েবল