ইন্টারফেস পদ্ধতিতে চূড়ান্ত যুক্তি - কী বিষয়?


189

জাভাতে, finalইন্টারফেস পদ্ধতিতে যুক্তিগুলি সংজ্ঞায়িত করা এবং এটি বাস্তবায়নকারী শ্রেণিতে যেমন মান্য না করা পুরোপুরি আইনী :

public interface Foo {
    public void foo(int bar, final int baz);
}

public class FooImpl implements Foo {

    @Override
    public void foo(final int bar, int baz) {
        ...
    }
}

উপরের উদাহরণে barএবং ক্লাস ভিএস এর ইন্টারফেসের bazবিপরীত finalসংজ্ঞা রয়েছে।

একই ফ্যাশনে, finalযখন কোনও শ্রেণি পদ্ধতি অন্য বাড়ে abstractবা না হয় তখন কোনও বিধিনিষেধ প্রয়োগ করা হয় না।

যদিও finalশ্রেণি পদ্ধতির বডিটির অভ্যন্তরে কিছু ব্যবহারিক মান রয়েছে, সেখানে finalইন্টারফেস পদ্ধতির পরামিতিগুলির জন্য নির্দিষ্ট কোনও বিন্দু রয়েছে ?


finalদেশীয় প্রকারের সাথে যেভাবেই অনুলিপি করা হয় সেগুলি কিছুই করে না।
পল টমবলিন

11
ঠিক আলোচনার পয়েন্ট হিসাবে: আমি কেবল এটি চেষ্টা করেছি এবং যদি দুটি interfaceসংজ্ঞা কেবল finalএকটি যুক্তির বৈশিষ্ট্যে পৃথক হয় , তবে ফলস্বরূপ .classফাইলগুলি বাইট-বাই বাইট অভিন্নভাবে হয় (এবং অবশ্যই javap -vএকই আউটপুট উত্পাদন করে)। একইভাবে দুটি শ্রেণীর ক্ষেত্রেও সত্য যা কেবল finalকোনও গুণকে আলাদা করে, উপায় দ্বারা!
জোছিম সউর

2
@ পল: এটি রেফারেন্স প্রকারের মতো ঠিক একই জিনিসটি করে: এটি যুক্তিগুলিকে নিজেই সংশোধন করতে বাধা দেয় (যদি প্রয়োগে ব্যবহৃত হয়)।
জোছিম সউর

পদ্ধতির স্বাক্ষরে এটির জনগণের মতোই প্রাসঙ্গিকতা রয়েছে।
রবিন

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

উত্তর:


103

এটির কোনও বিন্দু আছে বলে মনে হচ্ছে না। মতে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন 4.12.4 :

একটি পরিবর্তনশীল চূড়ান্ত ঘোষণা কার্যকর ডকুমেন্টেশন হিসাবে পরিবেশন করতে পারে যে এর মান পরিবর্তন হবে না এবং প্রোগ্রামিং ত্রুটিগুলি এড়াতে সহায়তা করতে পারে।

তবে ওভাররাইড পদ্ধতিগুলির স্বাক্ষরগুলির সাথে মেলেfinal একটি পদ্ধতি প্যারামিটারের কোনও সংশোধক উল্লেখ করা হয়নি, এবং কেবলমাত্র একটি প্রয়োগের শৃঙ্খলার মধ্যে কলারের উপর এর কোনও প্রভাব নেই। এছাড়াও, রবিন একটি মন্তব্যে উল্লিখিত হিসাবে, কোনও পদ্ধতি প্যারামিটারের সংশোধকটির উত্পন্ন বাইট কোডের কোনও প্রভাব নেই। (এটি অন্যান্য ব্যবহারের ক্ষেত্রে সত্য নয় ))finalfinal


পদ্ধতির পরামিতিও কি ভেরিয়েবল হিসাবে যোগ্যতা অর্জন করে? স্পষ্টতই এটি অনুশীলনে রয়েছে, তবে এটি কি স্পেসিফিকেশন প্রসঙ্গে?
মাইন্ডাস

11
এটি স্বাক্ষরগুলির সাথে মেলে ব্যবহার করা যায় না কারণ এটি আসল। ক্লাস ফাইলটিতে উপস্থিত হয় না। এটি কেবল সংকলকের জন্য।
রবিন

@ মিন্ডাস - জেএলএস বলে যে এখানে সাত ধরণের ভেরিয়েবল রয়েছে । পদ্ধতির পরামিতি তালিকার চতুর্থ স্থানে রয়েছে।
টেড হপ

3
ডকুমেন্টেশন অকেজো এর finalপাশেই , যেহেতু বাস্তবায়নকারী শ্রেণিতে সংশোধক প্রয়োগ করা হয় না। আপনার ইন্টারফেসের স্বাক্ষরটি কেবল মিথ্যা বলে।
স্টিফান হ্যাবারেল

জাভা 8 ভাষার স্পেসে এখন বলা হয়েছে যে এখানে আট ধরণের ভেরিয়েবল রয়েছে (সাতটি থেকে তারা ল্যাম্বডা প্যারামিটার যুক্ত করেছে )। পদ্ধতির প্যারামিটারগুলি তালিকায় এখনও চতুর্থ (জীবনের অন্তত কিছু জিনিস স্থিতিশীল বলে মনে হচ্ছে। :-))।
টেড হপ

25

উপ-শ্রেণিতে প্রয়োগকারী পদ্ধতি সন্নিবেশ করার সময় কিছু আইডিই বিমূর্ত / ইন্টারফেস পদ্ধতির স্বাক্ষরটি অনুলিপি করবে।

আমি বিশ্বাস করি না যে এটি সংকলকটিতে কোনও পার্থক্য করে।

সম্পাদনা: যদিও আমি বিশ্বাস করি এটি অতীতে সত্য ছিল, তবে আমি মনে করি না বর্তমান আইডিইগুলি এটি আর করে না।


2
বৈধ পয়েন্ট, যদিও আমি মনে করি না যে এই বৈশিষ্ট্যটি প্রয়োগ করা হয়েছিল (বা ঘটনাক্রমে ছেড়ে দেওয়া হয়েছিল) তখন অনেকগুলি আইডিই ছিল :-)
মাইন্ড

2
আমি মনে করি static transientক্ষেত্রগুলির বিভাগে । ;)
পিটার ল্যারি

1
এবং একটি বিমূর্ত শ্রেণিতে পাবলিক কনস্ট্রাক্টর।
পিটার লরি

1
ইন্টেলিজি এটি করে। আমার সংস্করণটি ইন্টেলিজ আইডিইএ 2016.1.3 বিল্ড # আইইউ -145.1617।
ডারমোস

1
@ ডর্মাউস, এটি আকর্ষণীয়, কারণ অ্যান্ড্রয়েড স্টুডিও (3.1.4 বিল্ড # এআই-173.4907809) তা করে না :(
গডফাদার

18

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


6

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

প্রশ্নের হিসাবে, আমি নীচে থেকে আমার নিজস্ব মন্তব্য উদ্ধৃত করতে চাই।

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

তবে হ্যাঁ, এটি একেবারেই অদ্ভুত বলে মনে হচ্ছে finalআপনি এটি ইন্টারফেসে ঘোষণা করতে পারেন , তবে বাস্তবায়নে এটি চূড়ান্ত নয় । এটি যদি আরও বোঝা হত তবে:

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


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

অবজেক্টস:

public static void main(String[] args) {
    StringBuilder cookingPot = new StringBuilder("Water ");
    addVegetables(cookingPot);
    addChicken(cookingPot);
    System.out.println(cookingPot.toString());
    // ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth 
    //      We forgot to add cauliflower. It went into the wrong pot.
}

private static void addVegetables(StringBuilder cookingPot) {
    cookingPot.append("Carrot ");
    cookingPot.append("Broccoli ");
    cookingPot = new StringBuilder(cookingPot.toString());
    //   ^--- Assignment allowed...
    cookingPot.append("Cauliflower ");
}

private static void addChicken(final StringBuilder cookingPot) {
    cookingPot.append("Chicken ");
    //cookingPot = new StringBuilder(cookingPot.toString());
    //     ^---- COMPILATION ERROR! It is final.
    cookingPot.append("ChickenBroth ");
}

finalশব্দ নিশ্চিত যে আমরা ঘটনাক্রমে একটি নতুন তৈরি করতে হবে স্থানীয় একটি সংকলন ত্রুটি দেখিয়ে রান্নার পাত্র যখন আমরা তা করতে চেষ্টা করে। এটি নিশ্চিত করেছে যে মুরগির ঝোলটি আমাদের আসল রান্নার পটে যুক্ত হয়েছে যা addChickenপদ্ধতিটি পেয়েছে। addVegetablesএটির তুলনা করুন যেখানে আমরা ফুলকপি হারিয়েছি কারণ এটি যুক্ত হয়েছে যে মূল পাত্রের পরিবর্তে একটি নতুন স্থানীয় রান্নার পাত্রে এটি যুক্ত হয়েছে।

মটরশুটি: এটি অবজেক্টগুলির মতো একই ধারণা (উপরে দেখানো হয়েছে) । মটরশুটি মূলত Objectজাভাতে। যাইহোক, মটরশুটি (জাভাবিয়ান) সম্পর্কিত তথ্যগুলির একটি সংজ্ঞায়িত সংগ্রহের চারপাশে সঞ্চয় এবং পাস করার একটি সুবিধাজনক উপায় হিসাবে বিভিন্ন অ্যাপ্লিকেশনে ব্যবহৃত হয়। ঠিক যেমন addVegetablesএকটি নতুন রান্নার পাত্র তৈরি করে রান্না করা প্রক্রিয়া জগাখিচুড়ি পারা StringBuilderএবং এটি দূরে নিক্ষেপ ফুলকপি সঙ্গে, এটা একটি রান্নার পাত্র সঙ্গে একই কাজ করতে পারে জাভা বিন


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

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

"এটি সত্যিকার অর্থেই প্রশ্নের সঠিক উত্তর নয়" আপনি ঠিক বলেছেন, আমি কী ভাবছিলাম তা আমি জানি না ... অবশ্যই জুলাইয়ের প্রথম দিকে বা কিছু ছিল। :)
ADTC

2

আমি বিশ্বাস করি এটি একটি অতিমাত্রায় বিশদ হতে পারে, এটি চূড়ান্ত কিনা তা বাস্তবায়ন বিশদ।

(একটি ইন্টারফেসে সর্বজনীন হিসাবে পদ্ধতি / সদস্য ঘোষণার মতো বাছাই করুন))

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