জাভা উত্তরাধিকার নিষিদ্ধ করার ভাল কারণ?


178

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


1
পেডেন্ট্রি: জাভা সংকলক দ্বারা আপনার জন্য উত্পন্ন ডিফল্ট কনস্ট্রাক্টর হ'ল যদি আপনি স্পষ্টভাবে আপনার কোডটিতে একটি না লিখে থাকেন। আপনি কোন যুক্তি নির্মাণকারীর অর্থ।
জন টপলি

এটি কি "অন্তর্নিহিত ডিফল্ট কনস্ট্রাক্টর" নয়?
ক্রেটজেল

2
"আপনার ক্লাসের জন্য আপনাকে কোনও কনস্ট্রাক্টর সরবরাহ করতে হবে না, তবে এটি করার সময় আপনাকে অবশ্যই সতর্কতা অবলম্বন করতে হবে automatically java.sun.com/docs/books/tutorial/java/javaOO/constructors.html - জন টপলি
জন

উত্তর:


184

আপনার সেরা রেফারেন্সটি হ'ল জোশুয়া ব্লচের দুর্দান্ত বই "কার্যকর জাভা" এর আইটেম 19, এটি "উত্তরাধিকারের জন্য নকশা এবং দস্তাবেজ বা অন্যথায় এটি নিষিদ্ধ" বলা হয়। (এটি দ্বিতীয় সংস্করণে আইটেম 17 এবং প্রথম সংস্করণে 15 আইটেম)) আপনার এটি সত্যই পড়া উচিত, তবে আমি সংক্ষেপে বলব।

পূর্বপুরুষের কাছ থেকে উত্তরাধিকার সূত্রে নকশাকৃত না হলে তাদের পিতামাতার সাথে উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণির মিথস্ক্রিয়াটি অবাক করে ও অবিশ্বাস্য হতে পারে।

ক্লাস দুই ধরণের মধ্যে আসা উচিত:

  1. শ্রেণিগুলি প্রসারিত করার জন্য ডিজাইন করা হয়েছে এবং এটি কীভাবে করা উচিত তা বর্ণনা করার জন্য পর্যাপ্ত ডকুমেন্টেশন রয়েছে

  2. ক্লাস চূড়ান্ত চিহ্নিত

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


6
আমার অভিজ্ঞতায় এটি অতিমাত্রার নয় যদি আমার পাশের কেউ কোড ব্যবহার করে। আমি কখনই বুঝতে পারি নি যে জাভাতে ডিফল্টরূপে পদ্ধতিগুলিকে ওভাররিডযোগ্য।
এরিক ওয়েলনাউ

9
কিছু কার্যকর জাভা বোঝার জন্য আপনাকে জোশের গ্রহণ নকশাটি বুঝতে হবে। তিনি বলেছেন [এর মতো কিছু] আপনার সর্বদা ক্লাস ইন্টারফেসগুলি এমনভাবে ডিজাইন করা উচিত যেন তারা কোনও পাবলিক এপিআই। আমি মনে করি সংখ্যাগরিষ্ঠ মতামতটি এই পদ্ধতির সাধারণত খুব বেশি ভারী এবং জটিল নয়। (ইয়াজিএনআই, ইত্যাদি)
টম হাটিন -

9
ভাল উত্তর. (আমি এটি ছয়টি অক্ষরের উল্লেখ করে প্রতিরোধ করতে পারি না, যেমন একটি স্থানও রয়েছে ... ;-)
joel.neely

36
দয়া করে মনে রাখবেন, ক্লাস চূড়ান্ত করা
টেস্টিংকে

10
যদি চূড়ান্ত শ্রেণি কোনও ইন্টারফেসে লিখতে থাকে তবে বিদ্রূপ করা কোনও সমস্যা হওয়া উচিত নয়।
ফ্রেড হাসলাম

26

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


এই উত্তরটি বেশ বুঝতে পারিনি। যদি আপনি কিছু মনে করেন না, আপনি কি "ওভাররাইডিং ক্লাসগুলি অন্য পদ্ধতিতে গণ্য করা আচরণ পরিবর্তন করতে পারবেন না" তার অর্থ কী তা ব্যাখ্যা করতে পারেন? আমি প্রথমে জিজ্ঞাসা করছি কারণ আমি বাক্যটি বুঝতে পারি নি, এবং দ্বিতীয়ত কারণ নেটবিনস সুপারিশ করছে যে আমার একটি ফাংশন যা আমি কনস্ট্রাক্টরের কাছ থেকে ডাকছি, তা হওয়া উচিত final
নাভি

1
@ নাভ আপনি যদি কোনও পদ্ধতি চূড়ান্ত করেন তবে একটি ওভাররাইডিং ক্লাস সেই পদ্ধতির নিজস্ব সংস্করণ রাখতে সক্ষম হবে না (বা এটি একটি সংকলন ত্রুটি হবে)। এই পদ্ধতিতে আপনি জানেন যে আপনি সেই পদ্ধতিতে প্রয়োগ করেছেন এমন আচরণ পরে আর পরিবর্তন হবে না যখন অন্য কেউ ক্লাস বাড়িয়ে দেয়।
বিলটি

19

ক্লাস ফাইনাল করার একটি কারণ হ'ল যদি আপনি উত্তরাধিকারের উপর রচনা জোর করতে চান। ক্লাসের মধ্যে সংযুক্ত মিলন এড়ানো সাধারণত এটি কাঙ্ক্ষিত।


15

এমন 3 টি ব্যবহারের ক্ষেত্রে রয়েছে যেখানে আপনি চূড়ান্ত পদ্ধতিতে যেতে পারেন।

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

ক্লাস ফাইনাল করার উদ্দেশ্য:

যাতে কোনও দেহ এই শ্রেণিগুলিকে প্রসারিত করতে না পারে এবং তাদের আচরণ পরিবর্তন করতে পারে।

উদাহরণস্বরূপ: মোড়কের ক্লাস পূর্ণসংখ্যা একটি চূড়ান্ত শ্রেণি। যদি সেই শ্রেণিটি চূড়ান্ত না হয়, তবে যে কোনও তার নিজের শ্রেণিতে পূর্ণসংখ্যার প্রসার ঘটাতে এবং পূর্ণসংখ্যার শ্রেণির প্রাথমিক আচরণ পরিবর্তন করতে পারে। এটি এড়াতে, জাভা সমস্ত র‌্যাপার ক্লাসকে চূড়ান্ত শ্রেণি হিসাবে তৈরি করেছিল।


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

4
এমনকি যদি আপনি সমস্ত পরিবর্তনশীল এবং পদ্ধতিগুলি চূড়ান্ত হিসাবে তৈরি করেন, তবুও অন্যরা আপনার শ্রেণির উত্তরাধিকারী হতে পারে এবং অতিরিক্ত কার্যকারিতা যুক্ত করতে পারে এবং আপনার শ্রেণীর প্রাথমিক আচরণ পরিবর্তন করতে পারে।
ব্যবহারকারী 1923551

3
> Class শ্রেণিটি যদি চূড়ান্ত না হয়, তবে যে কোনও তার নিজের শ্রেণিতে পূর্ণসংখ্যার প্রসার ঘটাতে এবং পূর্ণসংখ্যার শ্রেণির প্রাথমিক আচরণ পরিবর্তন করতে পারে। আসুন বলি যে এটির অনুমতি দেওয়া হয়েছিল এবং এই নতুন ক্লাসটি ডাকা হয়েছিল DerivedInteger, এটি এখনও মূল পূর্ণসংখ্যা শ্রেণিটি পরিবর্তন করে না এবং যে কেউ এটি ব্যবহার DerivedIntegerকরে তা তাদের নিজস্ব ঝুঁকিতে করে, সুতরাং এখনও সমস্যা হয় না কেন এটি সমস্যা।
সিদ্ধার্থ

12

আপনি অপরিবর্তনীয় বস্তু তৈরি করতে চাইতে পারেন ( http://en.wikedia.org/wiki/Immutable_object ), আপনি একটি সিঙ্গলটন তৈরি করতে চাইতে পারেন ( http://en.wikedia.org/wiki/Singleton_pattern ) দক্ষতা, সুরক্ষা বা সুরক্ষার কারণে কাউকে এই পদ্ধতিটিকে ওভাররাইড করা থেকে বিরত রাখতে।


7

উত্তরাধিকার চেইনসোয়ের মতো - খুব শক্তিশালী তবে ভুল হাতে ভয়ঙ্কর। হয় আপনি উত্তরাধিকারসূত্রে প্রাপ্ত কোনও শ্রেণি নকশা করেন (যা নমনীয়তা সীমাবদ্ধ করতে এবং অনেক বেশি সময় নিতে পারে) অথবা আপনার এটি নিষিদ্ধ করা উচিত।

কার্যকর জাভা 2 য় সংস্করণ আইটেম 16 এবং 17, বা আমার ব্লগ পোস্ট "উত্তরাধিকার ট্যাক্স" দেখুন


ব্লগ পোস্টের লিঙ্কটি নষ্ট হয়ে গেছে। এছাড়াও, আপনি কি মনে করেন এই সম্পর্কে আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন?

@ মিশেলটি: লিঙ্কটি স্থির করে রেখেছেন, ধন্যবাদ - আরও বিস্তৃত হওয়ার জন্য এটি অনুসরণ করুন :) (আমার এখনই এই মুহুর্তে যোগ করার সময় নেই, আমি ভয় পাচ্ছি।)
জন স্কিটি

@ জনস্কিট, ব্লগ পোস্টের লিঙ্কটি নষ্ট হয়ে গেছে।
লুসিফার

@ কেদারনাথ: এটি আমার পক্ষে কাজ করে ... এটি কিছুক্ষণের জন্য ভেঙে দেওয়া হয়েছিল , তবে এখন এটি কোডব্লগ.জোনসকেট.ুক-এ সঠিক পৃষ্ঠাটির দিকে ইঙ্গিত করছে ...
জন স্কিটি ২

4

হুম ... আমি দুটি বিষয় ভাবতে পারি:

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

আরও বাস্তবসম্মত একটি হ'ল কোনও বিষয়টিকে পরিবর্তনযোগ্য করে তোলা যায়। যেমন স্ট্রিংগুলি অপরিবর্তনীয়, তাই আপনার কোডটি নিরাপদে এতে রেফারেন্স রাখতে পারে

 String blah = someOtherString;

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


2

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


2

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


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

1
কোড জেনারেশনের পার্থক্যটি কোনও পৌরাণিক কাহিনী নয়, তবে সম্ভবত পারফরম্যান্সের লাভ রয়েছে। আমি যেমন এটি একটি ছোট লাভ বলেছি, একটি সাইট একটি 3.5% পারফরম্যান্স লাভের কথা উল্লেখ করেছে, কিছুটা উচ্চতর, যা বেশিরভাগ ক্ষেত্রে আপনার কোডে সমস্ত নাৎসি যাওয়ার পক্ষে উপযুক্ত নয়।
seanalltogether

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

1
Microbenchmark == শস্য অফ লবণ। এটি বলেছিল যে, 10 বি চক্রের উষ্ণতার পরে, 10B কলের উপরে গড় আমার ল্যাপটপে Eclipse এর অধীনে কোনও পার্থক্য দেখায় না। দুটি পদ্ধতি স্ট্রিং, ফাইনালটি 6.9643us, চূড়ান্ত ছিল 6.9641us returning এই ব-দ্বীপটি হ'ল ব্যাকগ্রাউন্ড শোর, আইএমএইচও।
joel.neely

1

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


2
সেই যুক্তিটি সম্পর্কে আমি বুঝতে পারি না এমন কিছু আছে - যদি কেউ সেই গণনা / ধ্রুবকগুলি পরিবর্তন করে যেগুলি পরিবর্তন করা উচিত নয় - তবে তার 100% দোষের কারণে কোনও ব্যর্থতা নেই? অন্য কথায়, পরিবর্তন কীভাবে কোনও উপকারে আসে?
ম্যাট বি

হ্যাঁ, এটি প্রযুক্তিগতভাবে "তাদের" ত্রুটিযুক্ত তবে ধারণা করুন যে অন্য কেউ লাইব্রেরি ব্যবহার করছেন যা পরিবর্তন সম্পর্কে সচেতন নয়, বিভ্রান্তির কারণ হতে পারে। আমি সর্বদা ভেবেছি যে এই কারণেই জাভা বেস ক্লাসগুলির অনেককে চূড়ান্ত চিহ্নিত করা হয়েছিল, যাতে লোকেরা মৌলিক কার্যকারিতা পরিবর্তন করতে বাধা দেয়।
আনসন স্মিথ

@ ম্যাট বি - আপনি ধরে নিয়েছেন বলে মনে হচ্ছে যে বিকাশকারী যিনি পরিবর্তন করেছেন তা জেনেশুনে করেছে বা তারা যত্নশীল হবে যে এটি তাদের দোষ ছিল। যদি আমার পাশের কেউ আমার কোড ব্যবহার করে তবে আমি এটি চূড়ান্ত হিসাবে চিহ্নিত করব যতক্ষণ না এটি পরিবর্তিত হওয়ার কথা।
এরিক ওয়েলনাউ

এটি আসলে জিজ্ঞাসিত ব্যক্তির থেকে 'ফাইনাল' এর আলাদা ব্যবহার।
ডিজেক্লেওয়ার্থ

এই উত্তরটি একটি সাবক্লাস লেখার ক্ষমতা সহ পৃথক ক্ষেত্রের উত্তরাধিকার এবং পরিবর্তনকে বিভ্রান্ত করে to উত্তরাধিকার নিষিদ্ধ না করে আপনি পৃথক ক্ষেত্র এবং পদ্ধতিগুলি চূড়ান্ত হিসাবে চিহ্নিত করতে পারেন (তাদের পুনর্নির্ধারণটি প্রতিরোধ করে)।
joel.neely

0

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

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