একটি ভেরিয়েবলের পুনরায় নিয়োগ বন্ধ করুন
যদিও এই উত্তরগুলি বৌদ্ধিকভাবে আকর্ষণীয়, তবে আমি ছোট সরল উত্তরটি পড়িনি:
কোনও ভেরিয়েবলকে অন্য কোনও অবজেক্টকে পুনরায় বরাদ্দ দেওয়া থেকে বিরত রাখতে সংকলকটি চাইলে কীওয়ার্ড ফাইনালটি ব্যবহার করুন ।
ভেরিয়েবল একটি স্ট্যাটিক ভেরিয়েবল, সদস্য ভেরিয়েবল, স্থানীয় পরিবর্তনশীল, বা আর্গুমেন্ট / পরামিতি ভেরিয়েবল কিনা, প্রভাব পুরোপুরি একই is
উদাহরণ
কর্মের প্রভাবটি দেখুন।
এই সহজ পদ্ধতিটি বিবেচনা করুন, যেখানে দুটি ভেরিয়েবল ( আরগ এবং এক্স ) উভয়কেই ভিন্ন ভিন্ন বস্তু পুনরায় বরাদ্দ করা যেতে পারে।
// Example use of this method:
// this.doSomething( "tiger" );
void doSomething( String arg ) {
String x = arg; // Both variables now point to the same String object.
x = "elephant"; // This variable now points to a different String object.
arg = "giraffe"; // Ditto. Now neither variable points to the original passed String.
}
স্থানীয় পরিবর্তনশীলকে চূড়ান্ত হিসাবে চিহ্নিত করুন । এটি একটি সংকলক ত্রুটির ফলস্বরূপ।
void doSomething( String arg ) {
final String x = arg; // Mark variable as 'final'.
x = "elephant"; // Compiler error: The final local variable x cannot be assigned.
arg = "giraffe";
}
পরিবর্তে, আসুন পরামিতি ভেরিয়েবলটিকে চূড়ান্ত হিসাবে চিহ্নিত করি । এটিও একটি সংকলক ত্রুটির ফলস্বরূপ।
void doSomething( final String arg ) { // Mark argument as 'final'.
String x = arg;
x = "elephant";
arg = "giraffe"; // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
}
গল্পের শিক্ষা:
আপনি যদি কোনও ভেরিয়েবলটি সর্বদা একই বস্তুর দিকে নির্দেশ করতে চান তা নিশ্চিত করতে চান তবে ভেরিয়েবলটি ফাইনাল হিসাবে চিহ্নিত করুন ।
আর্গুমেন্ট পুনরায় নিযুক্ত করুন
ভাল প্রোগ্রামিং অনুশীলন হিসাবে (যে কোনও ভাষায়), আপনাকে কলিং পদ্ধতিতে পাস করা অবজেক্ট ব্যতীত অন্য কোনও বস্তুর জন্য প্যারামিটার / আর্গুমেন্ট ভেরিয়েবলটি পুনরায় বরাদ্দ করা উচিত নয় । উপরের উদাহরণগুলিতে, কখনও কখনও লাইনটি লেখা উচিত নয় arg =
। যেহেতু মানুষ ভুল করে এবং প্রোগ্রামাররা মানব, তাই সংকলকটিকে আমাদের সহায়তা করতে বলি। প্রতিটি প্যারামিটার / আর্গুমেন্ট ভেরিয়েবলকে 'চূড়ান্ত' হিসাবে চিহ্নিত করুন যাতে সংকলক এই জাতীয় কোনও পুনরায়-কার্যাদি খুঁজে পেতে এবং ফ্ল্যাগ করতে পারে।
রেট্রোস্পেক্টে
যেমন অন্যান্য উত্তরে উল্লিখিত হয়েছে… প্রোগ্রামারদের যেমন অ্যারের শেষের আগে পড়ার মতো বোবা ভুলগুলি এড়াতে সহায়তা করার জাভাটির মূল নকশা লক্ষ্যটি দেওয়া হয়েছে, জাভা সমস্ত প্যারামিটার / আর্গুমেন্ট ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে 'চূড়ান্ত' হিসাবে প্রয়োগ করার জন্য তৈরি করা উচিত। অন্য কথায়, আর্গুমেন্টগুলি পরিবর্তনশীল হওয়া উচিত নয় । তবে হ্যান্ডসাইট 20/20 দৃষ্টিভঙ্গি এবং জাভা ডিজাইনারদের হাতে পুরো সময় ছিল।
সুতরাং, সবসময় final
সমস্ত যুক্তি যুক্ত করবেন?
আমাদের final
প্রতিটি পদ্ধতির পরামিতি ঘোষিত হওয়াতে যুক্ত করা উচিত?
- তত্ত্বগতভাবে, হ্যাঁ
- অনুশীলনে, না।
Only final
কেবলমাত্র পদ্ধতির কোডটি দীর্ঘ বা জটিল হলে যুক্ত করুন, যেখানে স্থানীয় বা সদস্য ভেরিয়েবলের জন্য যুক্তিটি ভুল হতে পারে এবং সম্ভবত পুনরায় বরাদ্দ করা যেতে পারে।
আপনি যদি কোনও যুক্তি পুনরায় বরাদ্দ না করার অভ্যাসটি ক্রয় করেন তবে final
আপনি প্রতিটিটিতে একটি যুক্ত করতে ঝুঁকবেন। তবে এটি ক্লান্তিকর এবং ঘোষণাটি পড়ার জন্য কিছুটা কঠিন করে তোলে।
সংক্ষিপ্ত সরল কোডের জন্য যেখানে আর্গুমেন্ট স্পষ্টতই একটি যুক্তি, এবং কোনও স্থানীয় ভেরিয়েবল বা সদস্য ভেরিয়েবল নয়, আমি যুক্তটি বিরক্ত করি না final
। কোডটি যদি পুরোপুরি সুস্পষ্ট থাকে তবে আমার বা অন্য কোনও প্রোগ্রামার কোনও সম্ভাবনা না রেখে রক্ষণাবেক্ষণ করছেন বা রিফ্যাক্টরিংয়ে ঘটনাক্রমে আর্গুমেন্টের পরিবর্তনশীলটিকে একটি যুক্তি ব্যতীত অন্য কিছু হিসাবে ভুল করছেন, তবে বিরক্ত করবেন না। আমার নিজের কাজে, আমি final
কেবলমাত্র দীর্ঘ বা ততোধিক যুক্ত কোডগুলিতে যুক্ত করি যেখানে কোনও যুক্তি স্থানীয় বা সদস্য ভেরিয়েবলের জন্য ভুল হতে পারে।
সম্পূর্ণতার জন্য আরও একটি মামলা যুক্ত হয়েছিল
public class MyClass {
private int x;
//getters and setters
}
void doSomething( final MyClass arg ) { // Mark argument as 'final'.
arg = new MyClass(); // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
arg.setX(20); // allowed
// We can re-assign properties of argument which is marked as final
}