কেন একটি ইন্টারফেসের সমস্ত ক্ষেত্র নিখুঁতভাবে স্থির এবং চূড়ান্ত হয়?


100

আমি কেবল এটি বোঝার চেষ্টা করছি কেন একটি ইন্টারফেসে সংজ্ঞায়িত সমস্ত ক্ষেত্র নিখুঁতভাবে staticএবং হয় final। ক্ষেত্রগুলি রাখার ধারণাটি staticআমার কাছে বোধগম্য হয় কারণ আপনার কোনও ইন্টারফেসের অবজেক্ট থাকতে পারে না তবে সেগুলি কেন final(স্পষ্টভাবে)?

কোন কেউ জানেনা কেন জাভা ডিজাইনার একটি ইন্টারফেস ক্ষেত্র তৈরীর সঙ্গে গিয়েছিলাম staticএবং final?


আমার জন্য একটি নোটের জন্য: এটি স্থির কারণ ইন্টারফেসের ক্ষেত্রগুলি বস্তুর অংশ হয়ে উঠবে না যা এটি কার্যকর করে।
বৃষ্টি

উত্তর:


127

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

বিটিডাব্লু: জাভাতে একটি ধ্রুবক একটি স্থির চূড়ান্ত ক্ষেত্র দ্বারা সংজ্ঞায়িত করা হয় (এবং কনভেনশন অনুসারে নামটি UPPER_CASE_AND_UNDERSCORES ব্যবহার করে)।


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

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

4
@ অ্যাড্রিয়ায়ান কোস্টার আপনি ঠিক বলেছেন যে চূড়ান্ত ক্ষেত্রটি ধ্রুবক: কোনও রাজ্য কেবল স্থায়ীদের অনুমতি দিয়ে প্রয়োগ করা হয় না। - এই বাক্যটি বোঝায় যে সমস্ত চূড়ান্ত ক্ষেত্র স্থির থাকে। আপনি যে শব্দগুলি ব্যবহার করেছেন সে সম্পর্কে আপনি আরও তর্ক করার চেষ্টা করতে পারেন, তবে অবশ্যই আপনার বক্তব্যটি ইজারা বিভ্রান্তিকর।
টোমা জাটো - মনিকা

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

এটি জাভা ডিজাইনারদের দ্বারা একটি ইন্টারফেসকে রাষ্ট্রবিহীন করার উদ্দেশ্য হতে পারে তবে তারা ব্যর্থ হয়েছিল কারণ একটি উদাহরণ ক্ষেত্রটি পরিবর্তনযোগ্য শ্রেণি হতে পারে। তারা ব্যর্থ হয়েছে তা স্বীকার করার পরিবর্তে, তারা উদাহরণস্বরূপ ক্ষেত্রগুলিকে জোর করে বেছে নেবে static finalযা constআপনি জাভাতে যতটা বাস্তবের কাছে আসল (বাস্তবের সি / সি ++) এর কাছাকাছি । দুর্ভাগ্যক্রমে এটি অন্তর্নিহিত এবং অ-বিশেষজ্ঞের জন্য বিভ্রান্তির কারণ হতে পারে। (আমি কেবল বুঝতে পেরেছি যে এগুলি staticহ'ল কারণ আমি অনিচ্ছাকৃত আচরণ দেখেছি learned আমি শিখেছি যে তারা finalকেবল এই উত্তর থেকে
not

28

হওয়ার কারণ final

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

হওয়ার কারণ static

যদি তারা স্থিতিশীল হয়, তবে তারা ইন্টারফেসের সাথে সম্পর্কিত, এবং অবজেক্ট নয়, বা রান-টাইম অবজেক্টের নয়।


18

এখানে বেশ কয়েকটি পয়েন্ট প্রকাশিত হয়েছে:

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

interface I {
  String TOKEN = SomeOtherClass.heavyComputation();
  JButton BAD_IDEA = new JButton("hello");
}

(সাবধান হন যে কোনও টীকাগুলির সংজ্ঞায়নের অভ্যন্তরে এটি করা জাভাককে বিভ্রান্ত করতে পারে, উপরোক্ত ঘটনাটি আসলে একটি স্ট্যাটিক আরম্ভকারীকে সংকলন করে)

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


9

ক্ষেত্রগুলি অবশ্যই স্থির থাকতে হবে কারণ তারা বিমূর্ত হতে পারে না (যেমন পদ্ধতিগুলি পারে)। যেহেতু তারা বিমূর্ত হতে পারে না, প্রয়োগকারীরা ক্ষেত্রের বিভিন্ন বাস্তবায়নকে যৌক্তিকভাবে সরবরাহ করতে সক্ষম হবে না।

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

শুধু আমার চিন্তা।


নওমান, "ক্ষেত্রগুলি অবশ্যই স্থিতিশীল হওয়া উচিত ..." সম্পর্কে আপনার ব্যাখ্যাটি খুব একটা বোঝায় না। তবে আপনি "ফিল্ডগুলি অবশ্যই চূড়ান্ত হতে হবে ..."
12

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

আপনার যদি এমন public staticক্ষেত্র থাকে যা না থাকে তবে finalফাইন্ডব্যাগগুলি অভিযোগ করবে (ঠিক!)।
টম হাটিন -

2

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

public interface iMine {
    String __ImplementationConstant();
    ...
}

public class AClass implements iMine {
    public String __ImplementationConstant(){
        return "AClass value for the Implementation Constant";
    }
    ...
}

public class BClass implements iMine {
    public String __ImplementationConstant(){
        return "BClass value for the Implementation Constant";
    }
    ...
}

যাইহোক, এই সিনট্যাক্সটি ব্যবহার করতে এটি সহজ, পরিষ্কার এবং অপ্রয়োজনীয় বাস্তবায়নের ঝুঁকির কম হবে:

public interface iMine {
    String __ImplementationConstant;
    ...
}

public class AClass implements iMine {
    public static String __ImplementationConstant =
        "AClass value for the Implementation Constant";
    ...
}

public class BClass implements iMine {
    public static String __ImplementationConstant =
        "BClass value for the Implementation Constant";
    ...
}

আপনি চূড়ান্ত হওয়ার চেয়ে ক্ষেত্রগুলি স্থির হওয়ার বিষয়ে আরও অভিযোগ করছেন বলে মনে হচ্ছে।
ড্যানিয়েল ইয়ানকোভস্কি

0

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

স্কেলায় আমাদের ইন্টারফেসগুলিতে ক্ষেত্র থাকতে পারে, যদিও অভ্যন্তরীণভাবে সেগুলি প্রয়োগ করা হয়েছে যেমন আমি উপরে বর্ণিত (পদ্ধতি হিসাবে)।


-1

static:

যেকোনো কিছু (পরিবর্তনশীল বা পদ্ধতি) যে staticজাভা যেন বরকত যাবে Classname.variablenameবা Classname.methodnameঅথবা সরাসরি। এটি কেবল বস্তুর নাম ব্যবহার করে প্রার্থনা করা বাধ্যতামূলক নয়।

ইন্টারফেসে, অবজেক্টগুলি ঘোষণা করা যায় না এবং staticঅবজেক্টের নামের প্রয়োজন ছাড়াই ক্লাস নামের মাধ্যমে ভেরিয়েবলগুলি আহ্বান করা সম্ভব করে।

final:

এটি ভেরিয়েবলের জন্য একটি ধ্রুবক মান বজায় রাখতে সহায়তা করে কারণ এটি এর সাবক্লাসগুলিতে ওভাররাইড করা যায় না।

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