জাভা পদ্ধতিতে প্যারামিটার চূড়ান্ত ঘোষণা করার কোনও কার্যকারিতা কারণ আছে কি?


117

জাভা পদ্ধতিতে প্যারামিটার চূড়ান্ত ঘোষণা করার কোনও কার্যকারিতা কারণ আছে কি?

যেমন:

public void foo(int bar) { ... }

বনাম:

public void foo(final int bar) { ... }

ধরে নিলাম যে barএটি কেবল পঠিত এবং কখনই সংশোধিত হয়নি foo()


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

1
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি কখনই মাইক্রো বেঞ্চমার্ক লিখবেন না। জেআইটি কোন অপ্টিমাইজেশন করতে পারে এবং কখন হতে পারে তা আপনি জানেন না এবং আপনি সম্ভবত এটি একটি "সাধারণ পরীক্ষার কেস" কীভাবে আচরণ করে সে সম্পর্কে একটি ভুল ধারণা পাবেন
এডমন্ডো ১৯৮৪

ভাল হতে পারে, তবে এখানে কেউ কোনও মাইক্রোব্যাঙ্কমার্ক লিখে বা পরামর্শ দেয়নি ...
কিপ

1
@ মাইক ব্ল্যান্ডফোর্ডের উত্তরটি মাইক্রো-বেঞ্চমার্ক ব্যবহারের পরামর্শ দেয় কি না?
বেন পেজ

জাভাতে মাইক্রো
বেনমার্কগুলি

উত্তর:


97

স্থানীয় ভেরিয়েবল এবং পরামিতিগুলির জন্য ক্লাস ফাইলে চূড়ান্ত কীওয়ার্ডটি উপস্থিত হয় না, সুতরাং এটি রানটাইম কর্মক্ষমতাকে প্রভাবিত করতে পারে না। কোডার্সের অভিপ্রায়টি স্পষ্ট করা যা ভেরিয়েবলটি পরিবর্তন করা যায় না (যা অনেকে এর ব্যবহারের জন্য সন্দেহজনক কারণ হিসাবে বিবেচনা করে) এবং বেনামে অভ্যন্তর শ্রেণীর সাথে ডিল করে dealing

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


5
আপনি ভাবেন যে চূড়ান্ত ভেরিয়েবল / প্যারামগুলি লুপ ভেরিয়েবল হিসাবে অপ্টিমাইজ করা যেতে পারে ... তবে একটি ভাল সংকলক / রানটাইম যেভাবেই চূড়ান্ত ছাড়াই তা নির্ধারণ করতে সক্ষম হবে ...
জন গার্ডনার

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

যেহেতু এটি অ-সংজ্ঞাবহ, তাই অপ্টিমাইজেশনের উপর নির্ভর করার কোনও উপায় নেই। অবশ্যই, ২০০৮-এর মূল উত্তর থেকে ভিএম বাস্তবায়নে অনেক কিছু পরিবর্তিত হতে পারে ;-)
রবিন

15

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


8
"এটি অত্যন্ত বিরল যে কোনও প্যারামিটার অপ্রত্যাশিতভাবে বরাদ্দ হওয়ার কারণে বাগগুলি ঘটে থাকে"। এটি আপনি যা ভাবেন তার চেয়ে বেশি সাধারণ ...
RAY

2
@RAY আপনি ঠিক থাকতে পারেন, আসলে এই দাবিটি ব্যাক আপ করার জন্য আমার কাছে কোনও ডেটা নেই (আমার নিজের অভিজ্ঞতার বাইরে)।
ডাবিস ভান্ডারমার

@ ডবসভান্ডারমিয়ার আরও সুনির্দিষ্ট হতে হবে, এটি আসলে "চূড়ান্ত প্যারামিটারের উপকার " নয়। আপনি যা বর্ণনা করছেন তা হ'ল অনামী নেস্টেড শ্রেণীর স্থানীয় স্কোপটিতে দৃশ্যমান করার জন্য কোনও স্থানীয় ভেরিয়েবলের (যার মধ্যে আমি প্যারামিটারগুলি সহ অন্তর্ভুক্ত) এর জন্য কেবল বাক্য গঠন প্রয়োজন required
সুইস্কি

0

ক্লাস লোডিংয়ের পরে চালিত সংকলক যেমন জেআইটি সংকলকগণ চূড়ান্ত পদ্ধতির সুবিধা নিতে পারে। ফলস্বরূপ, চূড়ান্ত ঘোষিত পদ্ধতিগুলির কিছু কার্যকারিতা সুবিধা থাকতে পারে।

http://www.javaperformancetuning.com/tips/final.shtml

ওহ এবং অন্য একটি ভাল সংস্থান

http://mindprod.com/jgloss/final.html


10
প্রশ্নটি ছিল প্যারামিটারগুলি চূড়ান্ত ঘোষিত হওয়ার বিষয়ে, যার কোনও কার্যকারিতা প্রভাব নেই।
রবিন

আধুনিক জেআইটি'র (হটস্পট) ফাইনালে কোনও (পরিমাপযোগ্য) পারফরম্যান্স প্রভাব নেই, প্যারামিটারগুলি বা শ্রেণিতে প্রয়োগ করা হোক
কোহলেম

2
আপনি যে দুটি আর্টিকেলটি সংযুক্ত করেছেন সেগুলি সুপারিশ করে যে চূড়ান্তটি বিকাশকারীদের জন্য অর্থাত্বক চিহ্ন এবং জেআইটি সংকলকরা চূড়ান্ত ব্যবহার করতে পারে (তবে অন্যরা উল্লেখ করেছেন যে, তাদের সত্যিকারের সেই তথ্যের প্রয়োজন নেই)। সুতরাং চূড়ান্ত বরং শব্দার্থক, যা সুস্পষ্টভাবে চিহ্নিত না করা সত্ত্বেও ভেরিয়েবল এবং পদ্ধতিগুলির দৃ const়তা নির্ধারণ করার জন্য আধুনিক সি / ++ কম্পাইলার সক্ষমতার সাথে সমান্তরাল।
ron

0

আরও একটি বিষয় যে উপরে যে পদ্ধতিতে ঘোষিত অ-চূড়ান্ত স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে - অভ্যন্তরীণ শ্রেণীর উদাহরণটি স্ট্যাক ফ্রেমটিকে বহির্ভূত করতে পারে, তাই অভ্যন্তরীণ অবজেক্টটি জীবিত থাকা অবস্থায় স্থানীয় ভেরিয়েবলটি বিলুপ্ত হতে পারে


-2

আমি ধারনা করি যে সংকলকটি সম্ভবত প্রাইভেট টাইপযুক্ত সমস্ত প্রাইভেট স্ট্যাটিক চূড়ান্ত ভেরিয়েবলগুলি মুছে ফেলতে পারে যেমন ইনট, এবং সি -+ ম্যাক্রোর মতো কোডগুলিতে সরাসরি ইনলাইন করে।

যাইহোক, এটি অনুশীলনে করা হয় তবে আমার কোনও ক্লু নেই, তবে কিছু স্মৃতি সঞ্চয় করার জন্য এটি করা যেতে পারে।


প্রশ্নটি প্রাইভেট স্ট্যাটিক ফাইনাল ভেরিয়েবল সম্পর্কে নয়।
লার্নের মারকুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.