1. ধ্রুবক

অন্যান্য অনেক প্রোগ্রামিং ভাষার ধ্রুবক থাকে , অর্থাৎ, ভেরিয়েবল যার মান পরিবর্তন করা যায় না । সাধারণত, এগুলি কিছু মৌলিক জিনিসের জন্য ব্যবহৃত হয় যেমন সংখ্যা Piবা বছরের মাসগুলিতে দিনের সংখ্যা। এটি বলেছে, নীতিগতভাবে, একজন প্রোগ্রামার যেকোন ভেরিয়েবলকে একটি ধ্রুবক বানাতে পারে, যদি সে সিদ্ধান্ত নেয় যে এটি করা প্রয়োজন।

তাহলে আপনি কিভাবে জাভাতে একটি অপরিবর্তনীয় পরিবর্তনশীল (ধ্রুবক) ঘোষণা করবেন? এর জন্য একটি বিশেষ কীওয়ার্ড আছে: final. একটি অপরিবর্তনীয় পরিবর্তনশীল তৈরি করা একটি সাধারণ একটি তৈরির মতোই দেখায়। শুধুমাত্র পার্থক্য হল ভেরিয়েবলের টাইপের আগে আপনাকে finalএই শব্দটি লিখতে হবে:

final Type name = value;

আপনি যদি একটি ভেরিয়েবলের জন্য একটি ভিন্ন মান নির্ধারণ করার চেষ্টা করেন final, তাহলে আপনার প্রোগ্রামটি কেবল কম্পাইল করবে না।

যখন এটি ঘোষণা করা হয় তখন একটি finalভেরিয়েবলকে আরম্ভ করতে হবে (একটি মান অবশ্যই বরাদ্দ করতে হবে)। এই নিয়মের একটি ব্যতিক্রম আছে: আপনি একটি স্ট্যাটিক ক্লাস ভেরিয়েবলের আরম্ভকে কনস্ট্রাক্টরে স্থানান্তর করতে পারেন। কিন্তু আপনি লেভেল 10 এ এটি সম্পর্কে শিখবেন

কীওয়ার্ডের সংখ্যা কমাতে, জাভা ডেভেলপাররা finalশুধুমাত্র ধ্রুবক ঘোষণা করার চেয়েও বেশি কিছুর জন্য শব্দটি ব্যবহার করে। finalপদ্ধতি এবং এমনকি ক্লাসেও প্রয়োগ করতে পারে। হিসাবে ঘোষিত পদ্ধতিগুলিকে finalওভাররাইড করা যাবে না এবং একটি শ্রেণীকে finalউত্তরাধিকারসূত্রে পাওয়া যাবে না।

যেকোন ভেরিয়েবলের আগে সংশোধক finalযোগ করা যেতে পারে: স্থানীয় ভেরিয়েবল, মেথড প্যারামিটার, ক্লাস ফিল্ড এবং স্ট্যাটিক ক্লাস ভেরিয়েবল।

মনে রাখবেন যে finalএকটি ভেরিয়েবল নামের আগে শুধুমাত্র সেই ভেরিয়েবলের কোনো পরিবর্তনের বিরুদ্ধে সুরক্ষা । যদি একটি ভেরিয়েবল একটি বস্তুর একটি রেফারেন্স সংরক্ষণ করে, তাহলে বস্তুটি এখনও পরিবর্তন করা যেতে পারে।

উদাহরণ:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
আমরা একটি অ্যারে তৈরি করি।

এটি অনুমোদিত নয়: পরিবর্তনশীল dataহিসাবে ঘোষণা করা হয় final

কিন্তু আপনি এটা করতে পারেন.
এবং এই.

গ্লোবাল ধ্রুবক

আপনি যদি আপনার প্রোগ্রামে বিশ্বব্যাপী ধ্রুবক ঘোষণা করার সিদ্ধান্ত নেন, তাহলে আপনাকে স্ট্যাটিক ক্লাস ভেরিয়েবল তৈরি করতে হবে এবং সেগুলি তৈরি করতে হবে publicএবং final. এই ধরনের ভেরিয়েবলগুলির নামের জন্য একটি বিশেষ শৈলী রয়েছে: এগুলি সমস্ত বড় অক্ষরে লেখা হয়, একটি আন্ডারস্কোর অক্ষর সহ শব্দগুলিকে আলাদা করতে ব্যবহৃত হয়।

উদাহরণ:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2. পরিবর্তনশীল ছায়া

আমরা আগেই বলেছি, আপনি একই পদ্ধতিতে একই নামের একাধিক স্থানীয় ভেরিয়েবল তৈরি করতে পারবেন না। বিভিন্ন পদ্ধতিতে, আপনি করতে পারেন।

কিন্তু এখানে যা আপনি সম্ভবত জানেন না: উদাহরণ ভেরিয়েবল এবং স্থানীয় পদ্ধতি ভেরিয়েবলের একই নাম থাকতে পারে।

উদাহরণ:

কোড পরিবর্তনশীল দৃশ্যমানতা
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

পদ্ধতিতে add, আমরা নামক একটি স্থানীয় পরিবর্তনশীল ঘোষণা করেছি sum। পদ্ধতির শেষ না হওয়া পর্যন্ত, এটি ইনস্ট্যান্স ভেরিয়েবলের ছায়া (বা মুখোশ ) রাখে।sum

ঠিক আছে, আপনি বলছেন, এটি কিছু অর্থে প্রত্যাশিত। কিন্তু তাতেই গল্পের শেষ নেই। এটা দেখা যাচ্ছে যে যদি একটি ইনস্ট্যান্স ভেরিয়েবল একটি স্থানীয় ভেরিয়েবল দ্বারা ছায়া করা হয়, তবে পদ্ধতির মধ্যে ইনস্ট্যান্স ভেরিয়েবলটি উল্লেখ করার একটি উপায় এখনও আছে। thisআমরা এর নামের আগে কীওয়ার্ড লিখে এটি করি :

this.name

এখানে একটি উদাহরণ যেখানে নাম দ্বন্দ্ব সফলভাবে সমাধান করা হয়েছে:

কোড পরিবর্তনশীল দৃশ্যমানতা
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

এবং ভেরিয়েবল কিওয়ার্ড  সহ বা ছাড়া সব জায়গায় পাওয়া যায় count । যে লাইনে  স্থানীয় ভেরিয়েবলটি ইনস্ট্যান্স ভেরিয়েবলকে ছায়া দেয় , ইনস্ট্যান্স ভেরিয়েবলটি শুধুমাত্র কীওয়ার্ড  ব্যবহার করে অ্যাক্সেস করা যেতে পারে ।sumthissumsumsumthis

যদি একটি ইনস্ট্যান্স ভেরিয়েবলের পরিবর্তে একটি স্ট্যাটিক ক্লাস ভেরিয়েবল ছায়াযুক্ত হয়, তাহলে আপনাকে কীওয়ার্ডের পরিবর্তে ক্লাসের নামের মাধ্যমে এটি অ্যাক্সেস করতে হবে this:

ClassName.name

উদাহরণ:

কোড পরিবর্তনশীল দৃশ্যমানতা
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

আপনি প্রিফিক্স হিসাবে  ক্লাসের নাম ব্যবহার করে বা ছাড়াই সর্বত্র count এবং স্ট্যাটিক ভেরিয়েবল অ্যাক্সেস করতে পারেন। যে লাইনগুলিতে স্থানীয় ভেরিয়েবলটি ইনস্ট্যান্স ভেরিয়েবলকে ছায়া দেয় , সেখানে ইনস্ট্যান্স ভেরিয়েবলের অ্যাক্সেস শুধুমাত্র উপসর্গ হিসাবে  ব্যবহার করার সময়ই সম্ভব ।sumSolutionsumsumsumSolution



3. একটি forলুপের ভিতরে ভেরিয়েবল

এবং আরও একটি ছোট কিন্তু আকর্ষণীয় তথ্য।

এমন একটি জায়গাও রয়েছে যেখানে একটি পরিবর্তনশীলকে একটি বিশেষ উপায়ে ঘোষণা করা হয় — একটি forলুপের ভিতরে ।

আপনি মনে করতে পারেন যে একটি forলুপে সাধারণত বন্ধনীতে একটি কাউন্টার ভেরিয়েবল থাকে। এবং এই ভেরিয়েবলের দৃশ্যমানতা কি হবে? সর্বোপরি, এটি লুপের শরীরে নেই। এটা কি পুরো পদ্ধতি? অথবা না?

forসঠিক উত্তর হল: লুপের হেডারে ঘোষিত একটি ভেরিয়েবল শুধুমাত্র লুপের বডিতে এবং লুপের হেডারেfor দৃশ্যমান ।

উদাহরণ:

কোড পরিবর্তনশীল দৃশ্যমানতা
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

সুতরাং, আপনি সর্বদা আপনার কোডে একের পর এক লুপ লিখতে পারেন এবং একই নামের সাথে কাউন্টার ভেরিয়েবল ব্যবহার করতে পারেন — যা কোনো সমস্যা তৈরি করবে না।

উদাহরণ:

কোড পরিবর্তনশীল দৃশ্যমানতা
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a