জাভাতে "ফাইনাল ক্লাস" বলতে কী বোঝায়?


569

আমি জাভা সম্পর্কে একটি বই পড়া করছি এবং এটা বলছেন যে আপনি পুরো ক্লাসের ডিক্লেয়ার করতে পারেন final। আমি যেখানে এটি ব্যবহার করেছি তা কিছুই ভাবতে পারি না।

আমি প্রোগ্রামিংয়ে কেবল নতুন এবং আমি ভাবছি প্রোগ্রামাররা যদি তাদের প্রোগ্রামগুলিতে এটি ব্যবহার করে । যদি তারা তা করে তবে তারা কখন এটি ব্যবহার করে তাই আমি এটি আরও ভাল করে বুঝতে পারি এবং কখন এটি ব্যবহার করব তা জানতে পারি।

জাভা যদি অবজেক্ট ওরিয়েন্টড হয়, এবং আপনি কোনও ক্লাস ঘোষণা finalকরেন, এটি কি শ্রেণীর অবজেক্টের বৈশিষ্ট্য ধারণার ধারণাকে বন্ধ করে দিবে না?

উত্তর:


531

সবার আগে, আমি এই নিবন্ধটি সুপারিশ করছি: জাভা: কখন একটি চূড়ান্ত শ্রেণি তৈরি করা যায়


যদি তারা তা করে তবে তারা কখন এটি ব্যবহার করে তাই আমি এটি আরও ভাল করে বুঝতে পারি এবং কখন এটি ব্যবহার করব তা জানতে পারি।

একটি finalক্লাস কেবল একটি শ্রেণি যা বাড়ানো যায় না

(এটির অর্থ এই নয় যে শ্রেণীর সমস্ত সামগ্রীর সাথে সম্পর্কিত সমস্ত রেফারেন্সগুলি এগুলি হিসাবে ঘোষিত হিসাবে কাজ করবে final))

যখন কোনও শ্রেণিটিকে চূড়ান্ত হিসাবে ঘোষণা করা কার্যকর হয় তবে এই প্রশ্নের উত্তরে isাকা পড়ে যায়:

জাভা যদি অবজেক্ট ওরিয়েন্টড হয়, এবং আপনি কোনও ক্লাস ঘোষণা finalকরেন, এটি কি শ্রেণীর অবজেক্টের বৈশিষ্ট্য ধারণার ধারণাকে বন্ধ করে দিবে না?

কিছুটা অর্থে হ্যাঁ।

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


39
উত্তরে যুক্ত করার জন্য, কার্যকর জাভার অন্যতম নীতি হ'ল উত্তরাধিকারের তুলনায় রচনাটিকে সমর্থন করে। চূড়ান্ত কীওয়ার্ড ব্যবহারও সেই নীতিটি প্রয়োগ করতে সহায়তা করে।
রিগি

9
"আপনি এটি মূলত দক্ষতা এবং সুরক্ষার কারণে করেন" " আমি এই মন্তব্যটি প্রায়শই শুনতে পাই (এমনকি উইকিপিডিয়া এটিও বর্ণনা করে) তবে আমি এখনও এই যুক্তির পিছনে যুক্তি বুঝতে পারি না। কেউ কীভাবে একটি চূড়ান্ত জাভা.এল.আং. স্ট্রিংয়ের অক্ষমতা বা নিরাপত্তাহীনতার অবসান ঘটাতে পারে তা বোঝানোর যত্ন নেই?
এমআরএ

27
@ এমআরএ যদি আমি একটি পদ্ধতি তৈরি করি যা কোনও স্ট্রিংকে প্যারামিটার হিসাবে গ্রহণ করে তবে আমি ধরে নিই যে এটি পরিবর্তনযোগ্য, কারণ স্ট্রিংস। এর ফলস্বরূপ, আমি জানি যে আমি স্ট্রিং অবজেক্টে কোনও পদ্ধতি নিরাপদে কল করতে পারি এবং পাস করা স্ট্রিং পরিবর্তন করতে পারি না। যদি আমি স্ট্রিং প্রসারিত করে এবং প্রকৃত স্ট্রিং পরিবর্তন করার জন্য স্ট্রিংয়ের প্রয়োগ পরিবর্তন করি তবে আপনি যে স্ট্রিং অবজেক্টটি অপরিবর্তনীয় বলে প্রত্যাশা করেছিলেন তা আর পরিবর্তনযোগ্য নয়।
ক্রাঙ্কার

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

1
@ শে ফাইনাল (অন্যান্য জিনিসের মধ্যে) কোনও বস্তুকে অপরিবর্তনীয় করে তুলতে ব্যবহৃত হয়, তাই আমি বলব না যে তাদের একে অপরের সাথে কোনও সম্পর্ক নেই। ডকস.ওরকল
সেল্রিটিস

184

জাভাতে, finalমডিফায়ারযুক্ত আইটেমগুলি পরিবর্তন করা যায় না!

এর মধ্যে রয়েছে চূড়ান্ত শ্রেণি, চূড়ান্ত পরিবর্তনশীল এবং চূড়ান্ত পদ্ধতি:

  • চূড়ান্ত শ্রেণি অন্য কোনও শ্রেণি দ্বারা বাড়ানো যায় না
  • একটি চূড়ান্ত ভেরিয়েবল অন্য মান পুনরায় নিযুক্ত করা যাবে না
  • একটি চূড়ান্ত পদ্ধতি ওভাররাইড করা যাবে না

40
আসল প্রশ্নটি কেন , কী নয় ।
ফ্রান্সেস্কো মেনজানি

8
"জাভাতে, finalমডিফায়ারযুক্ত আইটেমগুলি পরিবর্তন করা যায় না!" বিবৃতিটি খুব শ্রেণিবদ্ধ এবং সত্যই পুরোপুরি সঠিক নয়। গ্রেডি বুচ যেমন লিখেছেন, "একটি জিনিসের অবস্থা, আচরণ এবং পরিচয় রয়েছে"। যদিও আমরা কোনও বস্তুর পরিচয় একবারে তার চূড়ান্ত হিসাবে চিহ্নিত হওয়ার পরে তা পরিবর্তন করতে পারি না , তবে এর ক্ষেত্রগুলিকে তার ক্ষেত্রগুলিতে নতুন মান নির্ধারণের মাধ্যমে আমাদের তার অবস্থার পরিবর্তন করার সুযোগ finalরয়েছে (প্রদত্ত, অবশ্যই এটি রয়েছে)) যে কেউ ওরাকল জাভা সার্টিফিকেশন (যেমন 1Z0-808 ইত্যাদি) অর্জনের পরিকল্পনা করার বিষয়টি এটিকে মনে রাখা উচিত কারণ পরীক্ষায় এই দিকটি নিয়ে প্রশ্ন থাকতে পারে ...
ইগোর সৌদাকেভিচ

33

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

অপর একটি দৃশ্যটি অপ্টিমাইজেশনের জন্য: আমি মনে করি মনে আছে যে জাভা সংকলক চূড়ান্ত শ্রেণির কিছু ফাংশন কলকে ইনলাইন করেছে। সুতরাং, যদি আপনি কল করেন a.x()এবং একটি ঘোষণা করা হয় final, আমরা কোডটি কী হবে তা সংকলনকালে জানি এবং কলিং ফাংশনটিতে ইনলাইন করতে পারি। এটি আসলে করা হয়েছে কিনা আমার কোনও ধারণা নেই তবে চূড়ান্তভাবে এটি একটি সম্ভাবনা।


7
ইনলাইনিংটি সাধারণত রানটাইমে কেবলমাত্র ইন-টাইম সংকলক দ্বারা সম্পন্ন হয়। এটিও চূড়ান্ত ছাড়াই কাজ করে, তবে কোনও বিস্তৃত শ্রেণি নেই (বা এই বর্ধিত শ্রেণিগুলি এই পদ্ধতিটিকে স্পর্শ করে না) তা নিশ্চিত করার জন্য জেআইটি-সংকলকের আরও কিছু কাজ করতে হবে।
পাওলো ইবারম্যান

ইনলাইনিং এবং অপ্টিমাইজেশনের ইস্যুতে একটি ভাল লেখার সন্ধান পাওয়া যাবে এখানে: lemire.me/blog/archives/2014/12/17/…
জোশ হেমেন

24

এর সেরা উদাহরণ হ'ল

পাবলিক ফাইনাল ক্লাস স্ট্রিং

যা একটি পরিবর্তনযোগ্য শ্রেণি এবং এটি বাড়ানো যায় না cannot অবশ্যই, ক্লাস ফাইনালকে অপরিবর্তনীয় হওয়ার চেয়ে আরও অনেক কিছু রয়েছে।


হেই, কখনও কখনও এটি রুবে গোল্ডারজিয়ান বিকাশকারীদের নিজের থেকে সুরক্ষা দেয়।
জোয়েডবার্গ

16

প্রাসঙ্গিক পাঠ: বব মার্টিন দ্বারা প্রকাশিত ওপেন-ক্লোজড প্রিন্সিপাল

মূল উক্তি:

সফ্টওয়্যার সত্তা (শ্রেণি, মডিউল, ফাংশন, ইত্যাদি) এক্সটেনশনের জন্য উন্মুক্ত হওয়া উচিত, তবে পরিবর্তনের জন্য বন্ধ করা উচিত।

finalশব্দ মানে জাভা এই জোরদার করা কিনা এটা পদ্ধতি চালু বা শ্রেণীর উপর ব্যবহৃত হয়।


6
@ শিয়ান: এটি ঘোষণার finalফলে ক্লাসটি উন্মুক্ত না হয়ে এক্সটেনশনের জন্য বন্ধ হয়ে যায়? নাকি আমি খুব আক্ষরিকভাবে নিচ্ছি?
গোরান জোভিক

4
@ গোরান বিশ্বব্যাপী চূড়ান্ত প্রয়োগ করছে, হ্যাঁ। মূলত আপনি যে জায়গাগুলি পরিবর্তন চান না সেগুলি বেছে বেছে চূড়ান্তভাবে প্রয়োগ করা (এবং অবশ্যই এক্সটেনশনের জন্য ভাল হুক সরবরাহ করা)
সান প্যাট্রিক ফ্লয়েড

26
ওসিপিতে, "সংশোধন" বলতে উত্স কোডটি সংশোধন করতে বোঝায়, এবং "এক্সটেনশন" বাস্তবায়ন উত্তরাধিকারকে বোঝায়। সুতরাং, finalআপনি যদি প্রয়োগের কোডটি পরিবর্তনের জন্য বন্ধ করে রাখতে চান তবে উত্তরাধিকার সূত্রে সম্প্রসারণের জন্য উন্মুক্ত করে থাকেন তবে কোনও শ্রেণি / পদ্ধতি ঘোষণার উপর ব্যবহারের অর্থ হবে না।
রোগারিও

1
@ রোজারিও আমি স্প্রিং ফ্রেমওয়ার্ক রেফারেন্স (এমভিসি) থেকে রেফারেন্স (এবং ব্যাখ্যা) ধার নিয়েছি । আইএমএইচএও এটি আসল সংস্করণটির চেয়ে অনেক বেশি অর্থবোধ করে।
সান প্যাট্রিক ফ্লয়েড

এক্সটেনশন মারা গেছে। বেহুদা। Decimated। ধ্বংস করেছে। আমি ওসিপি সম্পর্কে চিন্তা করি না। ক্লাস বাড়ানোর অজুহাত কখনও নেই।
জোশ উডকক

15

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

এখানে ওও নীতির কোনও লঙ্ঘন নেই, ফাইনালটি কেবল একটি দুর্দান্ত প্রতিসাম্যতা সরবরাহ করে।

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


13

শব্দ finalনিজেই মানে কিছু চূড়ান্ত এবং কোন ভাবেই পরিবর্তন করা অনুমিত হয় না। যদি কোনও শ্রেণি চিহ্নিত করা থাকে finalতবে তা বাড়ানো বা উপ-শ্রেণিবদ্ধ করা যাবে না। কিন্তু প্রশ্ন হল আমরা কেন একটি শ্রেণি চিহ্নিত করি final? আইএমও এর বিভিন্ন কারণ রয়েছে:

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

আমি শুনেছি যে চিহ্নিতকরণ ক্লাস finalদক্ষতা উন্নত করে কিন্তু সত্যি বলতে আমি খুব বেশি ওজন বহন করার পক্ষে এই যুক্তিটি খুঁজে পাইনি।

জাভা যদি অবজেক্ট ওরিয়েন্টড হয় এবং আপনি ক্লাস ফাইনাল ঘোষণা করেন তবে কি ক্লাসের অবজেক্টের বৈশিষ্ট্য থাকার ধারণাটি থামবে না?

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

পাশের নোটে আমাদের উত্তরাধিকারের চেয়ে রচনাটি পছন্দ করা উচিত এবং finalকীওয়ার্ডটি এই নীতিটি কার্যকর করতে সহায়তা করে।


6

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


6

final class আপনি নতুন পদ্ধতি যুক্ত করার সময় সর্বজনীন এপিআই ভাঙ্গতে এড়াতে পারবেন

মনে করুন যে আপনার Baseক্লাসের সংস্করণ 1 এ আপনি করছেন:

public class Base {}

এবং একটি ক্লায়েন্ট করে:

class Derived extends Base {
    public int method() { return 1; }
}

তারপরে সংস্করণ ২-এ আপনি যদি একটি methodপদ্ধতি যুক্ত করতে চান Base:

class Base {
    public String method() { return null; }
}

এটি ক্লায়েন্ট কোড ভঙ্গ করবে।

আমরা যদি এর final class Baseপরিবর্তে ব্যবহার করতাম তবে ক্লায়েন্ট উত্তরাধিকার সূত্রে সক্ষম হত না এবং পদ্ধতি সংযোজনটি API টি ভাঙ্গবে না।


5

যদি শ্রেণিটি চিহ্নিত করা থাকে finalতবে এর অর্থ হ'ল শ্রেণীর কাঠামো বাহ্যিক কোনও কিছু দ্বারা সংশোধন করা যায় না। যেখানে আপনি সর্বাধিক দৃশ্যমান তা হ'ল যখন আপনি traditionalতিহ্যবাহী পলিমারফিক উত্তরাধিকার করছেন, মূলত class B extends Aকেবল কাজ করবে না। এটি মূলত আপনার কোডের কিছু অংশকে ( কিছু পরিমাণে) সুরক্ষিত করার উপায়

স্পষ্ট করার জন্য, চিহ্নিত করার শ্রেণিটি finalতার ক্ষেত্রগুলিকে চিহ্নিত করে না finalএবং যেমন বস্তুর বৈশিষ্ট্যগুলি নয় তবে পরিবর্তে প্রকৃত শ্রেণির কাঠামো রক্ষা করে।


1
বস্তুর বৈশিষ্ট্য বলতে কী বোঝায়? এর অর্থ কি ক্লাসটি চূড়ান্ত ঘোষণা করা হলে আমি ক্লাসের সদস্য পরিবর্তনশীলটি সংশোধন করতে পারি? সুতরাং চূড়ান্ত শ্রেণির একমাত্র উদ্দেশ্য হ'ল উত্তরাধিকার রোধ করা।
অ্যাডাম লাইউ

5

চূড়ান্ত শ্রেণীর সমস্যা সমাধানের জন্য:

ক্লাস ফাইনাল করার দুটি উপায় রয়েছে। প্রথমটি শ্রেণীর ঘোষণায় কীওয়ার্ড ফাইনালটি ব্যবহার করা হয়:

public final class SomeClass {
  //  . . . Class contents
}

ক্লাস ফাইনাল করার দ্বিতীয় উপায় হ'ল এর সমস্ত নির্মাণকারীকে ব্যক্তিগত হিসাবে ঘোষণা করা:

public class SomeClass {
  public final static SOME_INSTANCE = new SomeClass(5);
  private SomeClass(final int value) {
  }

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

public class Test{
  private Test(Class beanClass, Class stopClass, int flags)
    throws Exception{
    //  . . . snip . . . 
  }
}

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

সুতরাং আপনি নির্ধারিতভাবে এটির নির্মাণকারীকে ব্যক্তিগত করে ক্লাস ফাইনাল তৈরি করার সময় আপনার এটি চূড়ান্ত হিসাবে চিহ্নিত করা উচিত।


4

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

ক্লাসটিকে সাবক্লাস হওয়া থেকে বিরত রাখা বিশেষত কার্যকর হতে পারে যদি আপনি এপিআই বা লাইব্রেরি লিখেন এবং বেস আচরণের পরিবর্তনের দিকে প্রসারিত হওয়া এড়াতে চান।


4

ক্লাসটিকে ফাইনাল হিসাবে রাখার একটি সুবিধা:

স্ট্রিং ক্লাসটি চূড়ান্ত রাখা হয়েছে যাতে কেউ এর পদ্ধতিগুলিকে ওভাররাইড করতে না পারে এবং কার্যকারিতা পরিবর্তন করতে পারে। উদাহরণস্বরূপ, কেউ দৈর্ঘ্যের () পদ্ধতির কার্যকারিতা পরিবর্তন করতে পারে না। এটি সর্বদা একটি স্ট্রিংয়ের দৈর্ঘ্য ফিরে আসবে।

এই শ্রেণীর বিকাশকারী কেউই এই শ্রেণীর কার্যকারিতা পরিবর্তন করতে চান না, তাই তিনি এটিকে চূড়ান্ত হিসাবে রেখেছিলেন।


3

হ্যাঁ, সুরক্ষা বা গতির কারণে কখনও কখনও আপনি এটি চাইলেও করতে পারেন। এটি সি ++ এও সম্পন্ন হয়েছে। এটা তোলে নাও হতে পারে যে প্রোগ্রামের জন্য প্রযোজ্য কিন্তু moreso অবকাঠামো জন্য। http://www.glenmccl.com/perfj_025.htm


3

জাভাতে চূড়ান্ত কীওয়ার্ড নীচের উপলক্ষে ব্যবহার করে।

  1. ফাইনাল ভেরিয়েবল
  2. চূড়ান্ত পদ্ধতি
  3. ফাইনাল ক্লাস

জাভাতে চূড়ান্ত ভেরিয়েবলগুলি পুনরায় নিয়োগ করতে পারে না, চূড়ান্ত শ্রেণিগুলি প্রসারিত করতে পারে না এবং চূড়ান্ত পদ্ধতিগুলি ওভাররাইড করতে পারে না।


1

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

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


1

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

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

ডোমেনটি সন্ধান করা এবং এটি আপনার নকশার সিদ্ধান্তগুলি নির্ধারণ করতে দেওয়া সর্বোত্তম পন্থা।


1

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

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


1

অ্যান্ড্রয়েড লুপার ক্লাস এর একটি ভাল ব্যবহারিক উদাহরণ। http://developer.android.com/reference/android/os/Looper.html

লুপার শ্রেণি নির্দিষ্ট কার্যকারিতা সরবরাহ করে যা অন্য কোনও শ্রেণীর দ্বারা ওভাররাইড করার উদ্দেশ্যে নয়। অতএব, এখানে কোন উপ-শ্রেণি নেই।


1

ধরা যাক আপনার একটি Employeeক্লাস রয়েছে যার একটি পদ্ধতি রয়েছে greetgreetপদ্ধতিটি যখন এটিকে বলা হয় কেবল মুদ্রণ করে Hello everyone!। সুতরাং যে হয় প্রত্যাশিত আচরণ এর greetপদ্ধতি

public class Employee {

    void greet() {
        System.out.println("Hello everyone!");
    }
}

এখন, নীচের মত GrumpyEmployeeসাবক্লাস Employeeএবং ওভাররাইড greetপদ্ধতিটি যাক ।

public class GrumpyEmployee extends Employee {

    @Override
    void greet() {
        System.out.println("Get lost!");
    }
}

এখন নীচের sayHelloকোডটিতে পদ্ধতিটি দেখুন। এটি Employeeপ্যারামিটার হিসাবে উদাহরণস্বরূপ লাগে এবং অভিবাদন পদ্ধতিটিকে কল করে এটি আশা করে যে এটি বলবে Hello everyone!তবে আমরা যা পাই তা তা Get lost!। আচরণে এই পরিবর্তন কারণEmployee grumpyEmployee = new GrumpyEmployee();

public class TestFinal {
    static Employee grumpyEmployee = new GrumpyEmployee();

    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        testFinal.sayHello(grumpyEmployee);
    }

    private void sayHello(Employee employee) {
        employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
    }
}

শ্রেণি তৈরি করা গেলে এই পরিস্থিতি এড়ানো যায় । ক্লাস হিসাবে ঘোষণা না করা হলে কোনও চিত্তাকর্ষক প্রোগ্রামার যে পরিমাণ বিশৃঙ্খলা সৃষ্টি করতে পারে তা কেবল কল্পনা করুন ।EmployeefinalStringfinal


1

চূড়ান্ত শ্রেণি আর বাড়ানো যায় না। আমাদের যদি জাভাতে কোনও শ্রেণি উত্তরাধিকারসূত্রে তৈরি করার প্রয়োজন না হয় তবে আমরা এই পদ্ধতির ব্যবহার করতে পারি।

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


-1

অবজেক্ট ওরিয়েন্টেশন উত্তরাধিকার সম্পর্কে নয়, এটি এনক্যাপসুলেশন সম্পর্কে। এবং উত্তরাধিকার encapsulation বিরতি।

ক্লাস ফাইনাল ঘোষণা অনেক ক্ষেত্রে নিখুঁত ধারণা তৈরি করে। রঙ বা পরিমাণ অর্থের মতো কোনও "মান" উপস্থাপনকারী যে কোনও বস্তু চূড়ান্ত হতে পারে। তারা নিজেরাই দাঁড়ায়।

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

জোশুয়া ব্লচ "কার্যকর জাভা" উত্তরাধিকারের জন্য স্পষ্টভাবে নকশা করার বা এটি নিষিদ্ধ করার পরামর্শ দিয়েছেন এবং তিনি উল্লেখ করেছেন যে উত্তরাধিকারের জন্য ডিজাইনিং করা এত সহজ নয় not

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