ধ্রুবক

"অ্যামিগো, আপনি কি জানেন যে জাভাতে সব ভেরিয়েবল পরিবর্তন করা যায় না?"

"এটা কেমন, কিম? আসলে, 'ভেরিয়েবল' শব্দটিই পরিবর্তনের কথা বলে।"

"এতে কোন সন্দেহ নেই। অন্যান্য অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজের মত, জাভাতেও ধ্রুবক আছে , অর্থাৎ, ভেরিয়েবল যার মান পরিবর্তন করা যায় না । এবং 'ধ্রুবক' শব্দটিই স্থিরতার কথা বলে।"

"এবং তারা কি জন্য?"

"সাধারণত, এগুলি কিছু মৌলিক জিনিসের জন্য ব্যবহার করা হয় যেমন Piবছরের মাসের সংখ্যা বা দিনের সংখ্যা। এতে বলা হয়েছে, নীতিগতভাবে, একজন প্রোগ্রামার যে কোনও পরিবর্তনশীলকে একটি ধ্রুবক তৈরি করতে পারে, যদি সে সিদ্ধান্ত নেয় তাই প্রয়োজনীয়।"

"আপনি মানে একটি নাম, একটি গাড়ির রঙ, বা সপ্তাহের একটি দিনের নাম?"

"আপনি সঠিক ধারণা পেয়েছেন। এমন কিছু যা পরিবর্তন করা উচিত নয়।"

"এবং এই ধ্রুবকগুলি জাভাতে কেমন দেখায়?"

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

final Type name = value;

"আপনি যদি একটি ধ্রুবক তৈরি করেন এবং তারপরে এটিতে একটি ভিন্ন মান নির্ধারণ করার চেষ্টা করেন তবে কী হবে?"

"এটি জিজ্ঞাসা করা সঠিক প্রশ্ন! এবং সঠিক উত্তর হল: আপনি যদি একটি finalভেরিয়েবলের জন্য একটি ভিন্ন মান নির্ধারণ করার চেষ্টা করেন, তাহলে আপনার প্রোগ্রামটি কেবল কম্পাইল হবে না।"

"যদি আপনি একটি finalভেরিয়েবল ঘোষণা করেন কিন্তু এটিতে একটি মান নির্ধারণ না করেন?"

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

"এটি বলেছিল, যা কিছু আছে তা finalধ্রুবক নয়। কীওয়ার্ডের সংখ্যা কমাতে, জাভা বিকাশকারীরা finalকেবলমাত্র ধ্রুবক ঘোষণা করার চেয়েও বেশি শব্দ ব্যবহার করে। 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;
}

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

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

"আমি এটা জানি!"

"কিন্তু আপনি সম্ভবত জানেন না যে একটি ক্লাসের ভেরিয়েবল এবং একটি পদ্ধতিতে স্থানীয় ভেরিয়েবলের একই নাম থাকতে পারে।

উদাহরণ:

কোড পরিবর্তনশীল দৃশ্যমানতা
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, sum
count, sum
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.sum
this.count, this.sum
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

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

"এবং আরও একটি ছোট কিন্তু আকর্ষণীয় তথ্য। এমন একটি জায়গা আছে যেখানে একটি পরিবর্তনশীল একটি বিশেষ উপায়ে ঘোষণা করা হয় - আমি একটি forলুপের ভিতরের কথা বলছি ।" সাধারণত, একটি লুপের বন্ধনীতে forএকটি পরিবর্তনশীল থাকে । counterএবং এই ভেরিয়েবলের দৃশ্যমানতা কি হবে? সর্বোপরি, এটি লুপের শরীরে নেই। এটা কি পুরো পদ্ধতি? অথবা না?"

"আমি ইতিমধ্যে এই সম্পর্কে কিছু শুনেছি। আমি এটি বুঝতে পেরেছি, 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