চূড়ান্ত এবং অন্যান্য জাভা কীওয়ার্ড - 1

"হাই, অ্যামিগো!"

"হাই, বিলাবো!"

"আজ আমি আপনাকে জাভাতে বেশ কয়েকটি কীওয়ার্ড সম্পর্কে বলতে যাচ্ছি। তবে আমি সবচেয়ে আকর্ষণীয় দিয়ে শুরু করব: কীওয়ার্ড চূড়ান্ত। "

" একটি পরিবর্তনশীল, পদ্ধতি বা শ্রেণী ঘোষণা করার সময় আপনি কীওয়ার্ড চূড়ান্ত ব্যবহার করতে পারেন।"

"এবং কেন আমরা চূড়ান্ত প্রয়োজন?"

"এটি বেশ সহজ। যদি আমরা একটি পরিবর্তনশীলকে চূড়ান্ত হিসাবে চিহ্নিত করি, তাহলে এটি অপরিবর্তনীয় হয়ে যায়:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"আমি দেখি."

"যদি আমরা একটি পদ্ধতিকে চূড়ান্ত হিসাবে চিহ্নিত করি, তাহলে প্রাপ্ত ক্লাসে পদ্ধতিটিকে ওভাররাইড করা নিষিদ্ধ:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"আমি দেখছি। কিন্তু কেন আপনি একটি পদ্ধতি ওভাররাইড নিষিদ্ধ করতে হবে?"

"ঠিক আছে, একটি উদাহরণ হিসাবে, ধরুন একজন প্রোগ্রামার একটি পদ্ধতিতে অনেক গুরুত্বপূর্ণ কোড লিখেছেন এবং গ্যারান্টি দিতে চান যে তার ক্লাসের উত্তরাধিকারী সমস্ত ক্লাসের নির্দিষ্ট আচরণ থাকবে।"

"এবং অবশেষে, তৃতীয় ব্যবহার।"

"যদি আমরা কিওয়ার্ড ফাইনাল দিয়ে একটি ক্লাস চিহ্নিত করি, তাহলে এটি উত্তরাধিকারসূত্রে পাওয়া যাবে না।"

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"এবং কেন আমরা একটি শ্রেণীকে উত্তরাধিকারী হতে বাধা দেব?"

"আপনার বোঝা উচিত যে আমরা উত্তরাধিকারকে বিরক্তিকর হতে বাধা দিই না, বরং নিরাপত্তা এবং কোডের অখণ্ডতার জন্য। যদি শ্রেণী উত্তরাধিকার নিষিদ্ধ না হয়, তাহলে এর অর্থ হল এটি অনুমোদিত। এবং ক্লাসের দ্বারা লিখিত কোড ডিজাইনার এই শ্রেণীর বস্তুর পাশাপাশি যেকোন প্রাপ্ত শ্রেণীর বস্তুর জন্য সঠিকভাবে কাজ করবে।"

"কিন্তু যদি একজন বিকাশকারী বুঝতে পারেন যে তার ক্লাসে এমনকি ছোট পরিবর্তনের ফলে সবকিছু প্রত্যাশিতভাবে কাজ করা বন্ধ করে দেবে, তাহলে উত্তরাধিকার নিষিদ্ধ করাই ভাল।"

"উদাহরণস্বরূপ, স্ট্রিং ক্লাসকে চূড়ান্ত হিসাবে ঘোষণা করা হয়েছে, যেমন সমস্ত আদিম প্রকার: পূর্ণসংখ্যা, বুলিয়ান, ডাবল, ক্যারেক্টার..."

"আহ, বুঝেছি। স্ট্রিং ক্লাসটি একটি অপরিবর্তনীয় শ্রেণী হিসাবে তৈরি করা হয়েছিল এবং যদি তারা হঠাৎ পরিবর্তনযোগ্য হয়, তাহলে অনেক কিছু কাজ করা বন্ধ করে দেবে।"

"আচ্ছা, প্রায়। আসুন এটিকে এভাবে রাখি: সবকিছু প্রায় আগের মতোই কাজ করবে, কিন্তু কখনও কখনও এমন ত্রুটি দেখা দেবে যা খুঁজে পাওয়া এবং বোঝা খুব কঠিন হবে। তাই, কিছু ক্ষেত্রে, উত্তরাধিকারসূত্রে ক্লাস বা পদ্ধতিগুলি আসলেই পাপ নয়, কিন্তু এটা নিষেধ মানে পরে ধরার জন্য কম ত্রুটি।"

"আপনি আর কোথায় ফাইনাল ব্যবহার করতে পারেন?"

"আপনি ফাংশন প্যারামিটারের আগে চূড়ান্ত এবং একটি পদ্ধতিতে ভেরিয়েবলের আগে ব্যবহার করতে পারেন। এখানে একটি উদাহরণ:"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;this.name = displayName;
}

"এবং এর মানে কি?"

"আচ্ছা, দুটি আছে। প্রথমত, আমরা একটি ভেরিয়েবলকে চূড়ান্ত হিসাবে ঘোষণা করি যদি আমরা অন্য বিকাশকারীদের বলতে চাই যে এই মানটি একটি নির্দিষ্ট ধ্রুবক, এবং শুধুমাত্র একটি পরিবর্তনশীল নয়।"

উদাহরণস্বরূপ, আমরা একটি মূল্যের উপর ভিত্তি করে বিক্রয় কর গণনা করতে চাই:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"এবং দ্বিতীয়ত, স্থানীয় বা বেনামী অভ্যন্তরীণ ক্লাস লেখার সময় আমাদের এই ধরনের পরিবর্তনশীল প্রয়োজন। আমি এই ধরনের ক্লাস সম্পর্কে শীঘ্রই আপনাকে বলব। কিন্তু আজ নয়।"

"ঠিক আছে, এখন পর্যন্ত খুব জটিল কিছু হয়নি।"

"অনুগ্রহ করে মনে রাখবেন যে শুধুমাত্র ভেরিয়েবল অপরিবর্তনীয় হয়ে যায়, এমন কোন বস্তু নয় যেটি এটি উল্লেখ করতে পারে। বস্তুটি এখনও পরিবর্তন করা যেতে পারে।"

"আমি আসলে এই সম্পর্কে জিজ্ঞাসা করতে যাচ্ছিলাম। এবং বস্তুটিকে অপরিবর্তনীয় করার কোন উপায় নেই?"

"না, যদি না আপনি একটি অপরিবর্তনীয় ক্লাস লেখেন।"

"অনুগ্রহ করে মনে রাখবেন যেহেতু একটি চূড়ান্ত ভেরিয়েবলের মান পরিবর্তন করা যাবে না, আপনাকে অবশ্যই তার প্রাথমিক মান অবিলম্বে বরাদ্দ করতে হবে।"

এই কোড কম্পাইল হবে এই কোড কম্পাইল করা হবে না
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"কিন্তু, এটি বলেছিল, জাভা আপনাকে কনস্ট্রাক্টর না হওয়া পর্যন্ত একটি ক্লাসের চূড়ান্ত ভেরিয়েবলের শুরুতে বিলম্ব করতে দেয়।"

এই কোড কম্পাইল হবে এই কোড কম্পাইল করা হবে না
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"অতিরিক্ত, বিভিন্ন কনস্ট্রাক্টর বিভিন্ন মান সহ চূড়ান্ত ভেরিয়েবল শুরু করতে পারে। এটি বেশ সুবিধাজনক:"

এই কোড কম্পাইল হবে
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"এটি সত্যিই একটি আকর্ষণীয় বিষয় ছিল, এবং একেবারে সবকিছুই বোধগম্য হয়। ধন্যবাদ, বিলাবো!"