জাভা `চূড়ান্ত` পদ্ধতি: এটি কি প্রতিশ্রুতি দেয়?


141

জাভা ক্লাসে একটি পদ্ধতিকে সংজ্ঞায়িত করা যায় final, চিহ্নিত করতে যে এই পদ্ধতিটি ওভাররাইড নাও হতে পারে:

public class Thingy {
    public Thingy() { ... }
    public int operationA() {...}
    /** this method does @return That and is final. */
    public final int getThat() { ...}
}

এটি পরিষ্কার, এবং এটি দুর্ঘটনাজনিত ওভাররাইডিং থেকে রক্ষা করার জন্য বা কোনও কার্যকারিতা হতে পারে - তবে এটি আমার প্রশ্ন নয়।

আমার প্রশ্নটি হল: ওওপি দৃষ্টিকোণ থেকে আমি বুঝতে পেরেছি যে কোনও পদ্ধতির সংজ্ঞা finalদিয়ে শ্রেণি ডিজাইনার প্রতিশ্রুতি দেয় যে এই পদ্ধতিটি সর্বদা বর্ণিত, বা বোঝানো হিসাবে কাজ করবে। তবে প্রায়শই এটি শ্রেণীর লেখকের প্রভাবের বাইরেও হতে পারে, যদি পদ্ধতিটি আরও বেশি জটিল হয় তবে কেবল কোনও সম্পত্তি সরবরাহ করা

সিনট্যাকটিক সীমাবদ্ধতা আমার কাছে স্পষ্ট, তবে ওওপি অর্থে এর অর্থ কী? হয় finalসবচেয়ে বর্গ লেখক দ্বারা এই অর্থে সঠিকভাবে ব্যবহার করেন নি?

কোন finalপদ্ধতির কী ধরনের "চুক্তি" প্রতিশ্রুতি দেওয়া হয়?

উত্তর:


155

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

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

কিছুকে অনুকূলিতকরণযোগ্য হতে বাধা দেওয়ার বিভিন্ন কারণ রয়েছে, যার মধ্যে রয়েছে:

  • পারফরম্যান্স - কিছু সংকলক অপারেশন বিশ্লেষণ ও অনুকূলিত করতে পারে, বিশেষত পার্শ্ব প্রতিক্রিয়া ছাড়াই।

  • এনক্যাপসুলেটেড ডেটা পান - অপরিবর্তনীয় অবজেক্টগুলিতে দেখুন যেখানে নির্মাণের সময় তাদের বৈশিষ্ট্যগুলি সেট করা আছে এবং কখনই পরিবর্তন করা উচিত নয়। অথবা এই গুণাবলী থেকে প্রাপ্ত একটি গণনা করা মান। একটি ভাল উদাহরণ জাভা Stringক্লাস।

  • নির্ভরযোগ্যতা এবং চুক্তি - অবজেক্টস প্রিমিটিভের (দ্বারা গঠিত int, char, double, ইত্যাদি) এবং / অথবা অন্যান্য বস্তু। Components উপাদানগুলির জন্য প্রযোজ্য সমস্ত ক্রিয়াকলাপগুলি প্রযোজ্য বা এমনকি যৌক্তিক হওয়া উচিত নয় যখন সেগুলি বড় অবজেক্টে ব্যবহৃত হয়। finalপরিবর্তক সহ পদ্ধতিগুলি তা নিশ্চিত করতে ব্যবহার করা যেতে পারে। কাউন্টার ক্লাস একটি ভাল উদাহরণ।


public class Counter {
    private int counter = 0;

    public final int count() {
        return counter++;
    }

    public final int reset() {
        return (counter = 0);
    }
}

তাহলে public final int count()পদ্ধতি নয় final, আমরা ভালো কিছু করতে পারেন:

Counter c = new Counter() {   
    public int count() {
        super.count();   
        return super.count();   
    } 
}

c.count(); // now count 2

বা এর মতো কিছু:

Counter c = new Counter() {
    public int count() {
        int lastCount = 0;
        for (int i = super.count(); --i >= 0; ) {
            lastCount = super.count();
        }

        return lastCount;
    }
}

c.count(); // Now double count

27

চূড়ান্ত পদ্ধতিটি কোন ধরণের "চুক্তি" প্রতিশ্রুতি দেয়?

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


তবে এই দৃষ্টিভঙ্গিটি কি এই মূল প্রশ্নটিকে বোঝায় না "এই চূড়ান্ত পদ্ধতিটি সর্বদা প্রতিশ্রুতি হিসাবে আচরণ করবে" যে আমাকে চূড়ান্ত পদ্ধতির অভ্যন্তর থেকে কোনও চূড়ান্ত পদ্ধতি না বলা উচিত? কারণ, আমি যদি বলি পদ্ধতিটি ওভাররাইড হয়ে থাকতে পারে এবং তাই আমি আমার চূড়ান্ত পদ্ধতির আচরণের গ্যারান্টি দিতে পারি না?
তোয়াই

8

প্রথমত, আপনি নন-অ্যাবস্ট্রাক্ট ক্লাসের finalপাশাপাশি ক্ষেত্র এবং পদ্ধতিগুলি চিহ্নিত করতে পারেন । এইভাবে পুরো ক্লাসটি সাবক্ল্যাস করা যাবে না। সুতরাং, শ্রেণীর আচরণ স্থির করা হবে।

আমি সম্মত হই যে চিহ্নিতকরণ পদ্ধতিগুলি finalগ্যারান্টি দেয় না যে এই পদ্ধতিগুলি চূড়ান্ত পদ্ধতিগুলিকে কল দিলে সাবক্লাসে তাদের আচরণ একই হবে be আচরণ যদি সত্যই স্থির করা দরকার, এটি কনভেনশন এবং সাবধানতার সাথে নকশার মাধ্যমে অর্জন করতে হবে। এবং জাভাডোক এ ধারণা করতে ভুলবেন না! (জাভা ডকুমেন্টেশন)

সর্বশেষে তবে সর্বনিম্ন নয়, finalজাভা মেমোরি মডেল (জেএমএম) -এ কীওয়ার্ডটির খুব গুরুত্বপূর্ণ ভূমিকা রয়েছে। এটি জেএমএম দ্বারা গ্যারান্টিযুক্ত যে finalক্ষেত্রের দৃশ্যমানতা অর্জনের জন্য আপনার সঠিক সিঙ্ক্রোনাইজেশন প্রয়োজন হবে না। উদাহরণ:

class A implements Runnable {
  final String caption = "Some caption";                           

  void run() {
    // no need to synchronize here to see proper value of final field..
    System.out.println(caption);
  }
}  

হ্যাঁ আমি চূড়ান্ত ক্লাস সম্পর্কে জানি - সহজ ক্ষেত্রে। জেএমএম সহ চূড়ান্ত ক্ষেত্রগুলি সম্পর্কে ভাল বিষয়, কোনও সিঙ্কের প্রয়োজন নেই ... হুম: এটি কেবল "পয়েন্টার" কে বোঝায়, তাই না? আমি এখনও এটি আউট-সিঙ্কের সাথে সংশোধন করতে পারতাম যা এটি উল্লেখ করে (ঠিক আছে, না String, তবে ব্যবহারকারী সংজ্ঞায়িত শ্রেণিতে)। কিন্তু আপনার সম্পর্কে "চূড়ান্ত আচরণ নিশ্চয়তা দেয় না" কি বলেন ঠিক আমার বিন্দু। আমি সম্মত, ডক এবং নকশা গুরুত্বপূর্ণ।
তোয়াই

@ তোয়ুই ঠিক বলেছেন যে finalযৌগিক বস্তুগুলিতে করা পরিবর্তনগুলির দৃশ্যমানতা নিশ্চিত করবে না Map
ভিক্টর সোরোকিন

0

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


1
হ্যাঁ, আমি যা বোঝাতে চেয়েছি তা হ'ল। ঠিক। আমি "দুর্বল গ্যারান্টি" শব্দটি পছন্দ করি :-) এবং আমি (বেশিরভাগ ক্ষেত্রে) সি ++ এর মতো const। হিসাবে char const * const = "Hello"বা char const * const addName(char const * const name) const...
তোয়াই

0

না, এটি শ্রেণীর লেখকের প্রভাবের বাইরে নয়। আপনি এটিকে আপনার উত্পন্ন ক্লাসে ওভাররাইড করতে পারবেন না, সুতরাং এটি বেস ক্লাসের লেখক যা চেয়েছিল তা করবে।

http://download.oracle.com/javase/tutorial/java/IandI/final.html

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


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