ইন্টারফেস ভেরিয়েবলগুলি স্থির এবং ডিফল্টরূপে চূড়ান্ত হয় কেন?


274

কেন জাফায় ইন্টারফেস ভেরিয়েবলগুলি স্থির এবং চূড়ান্তভাবে ডিফল্ট হয়?


41
আপনার ইন্টারফেসের মধ্যে কোনও পরিবর্তনশীল রাখা উচিত নয়।
চেরুভিম

34
কারণ ইন্টারফেসগুলি চুক্তিগুলি সংজ্ঞায়িত করে যা বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে। একটি ভেরিয়েবলের মান বাস্তবায়ন।
চেরোভিম

10
আমরা অবশ্যই যখন জানতে পারি ইন্টারফেসটি বাস্তবায়নকারী সমস্ত শ্রেণীর কিছু ধ্রুবক পরিবর্তনশীল রয়েছে (উদাহরণস্বরূপ ক্ষেত্রের নাম)।
অনিকেত ঠাকুর

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

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

উত্তর:


264

ফিলিপ শ এর জাভা ইন্টারফেস ডিজাইন এফএকিউ থেকে:

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

উৎস


39
নোট করুন যে বিমূর্ত ক্লাসগুলি "তাদের নিজস্বভাবে" ইনস্ট্যান্ট করা যাবে না এবং সেগুলির উদাহরণ ভেরিয়েবলও থাকতে পারে।
macias

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

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

6
রাষ্ট্রীয় সমস্যার একাধিক উত্তরাধিকার এড়ানোর জন্য ইন্টারফেসগুলিতে উদাহরণ পরিবর্তনশীল থাকতে পারে না। Docs.oracle.com/javase/tutorial/java/IandI/… দেখুন । একটি শ্রেণি একই কারণে এক শ্রেণির বেশি বাড়াতে পারে না।
ড্যানিস 21

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

41

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

সুতরাং যদি কোনও ইন্টারফেস পরিবর্তনশীল হয় তবে এটি স্পষ্টতই স্থির, চূড়ান্ত এবং স্পষ্টতই প্রকাশ্য হবে !!!


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

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

36

সর্বজনীন : ইন্টারফেসে উপস্থিত পদ্ধতিগুলির মতো সমস্ত শ্রেণি জুড়ে অ্যাক্সেসযোগ্যতার জন্য

স্ট্যাটিক : ইন্টারফেসের কোনও অবজেক্ট থাকতে পারে না বলে ইন্টারফেসনাম.ভ্যারেবলনেম এটি রেফারেন্স করতে বা এটি প্রয়োগকারী শ্রেণিতে সরাসরি ভেরিয়েবল নাম ব্যবহার করতে পারে।

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

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


15

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

interfaceক্ষেত্রগুলি স্বয়ংক্রিয়ভাবে final(ধ্রুবক) হয়ে যাওয়ার পেছনের কারণ হ'ল বিভিন্ন বাস্তবায়ন দুর্ঘটনাক্রমে ইন্টারফেস ভেরিয়েবলের মান পরিবর্তন করা যা অনিচ্ছাকৃতভাবে অন্যান্য বাস্তবায়নগুলির আচরণকে প্রভাবিত করতে পারে prevent নীচের দৃশ্যের কল্পনা করুন যেখানে কোনও interfaceসম্পত্তি স্পষ্টভাবে finalজাভা দ্বারা পরিণত হয়নি :

public interface Actionable {
    public static boolean isActionable = false;

    public void performAction();
}

public NuclearAction implements Actionable {

    public void performAction() {
        // Code that depends on isActionable variable
        if (isActionable) {
            // Launch nuclear weapon!!!
        }
    }
}

এখন, একটু চিন্তা করুন, যদি ঘটতে পারে এমন অন্য শ্রেণি যদি Actionableইন্টারফেস ভেরিয়েবলের অবস্থার পরিবর্তন করে:

public CleanAction implements Actionable  {

    public void performAction() {
        // Code that can alter isActionable state since it is not constant
        isActionable = true;
    }
}

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

যেহেতু আমরা জানি না যে একটিগুলির প্রতিটি বাস্তবায়ন কীভাবে interfaceএই ভেরিয়েবলগুলি ব্যবহার করবে, সেগুলি অবশ্যই স্পষ্টতই হবে final


9

কারণ অন্য কিছু বাস্তবায়নের অংশ, এবং ইন্টারফেসে কোনও বাস্তবায়ন থাকতে পারে না।


1
তাহলে ফাইনালের কারণ কী?
জোঠি

7
এটি একটি ধ্রুবক নির্দেশ করতে। জাভাতে কোন কনস্টের শব্দ নেই। স্থির চূড়ান্ত হল আপনি কীভাবে স্থিরতা ঘোষণা করবেন।
আমির আফগানি

5
জাভা 8-এর পরে এগুলি একটি বাস্তবায়ন ধারণ করতে পারে তবে আপনার যদি ব্যাকওয়ার্টের সামঞ্জস্যতা প্রয়োজন না হয় তবে এটি ব্যবহার না করার পক্ষে সুপারিশ করা হয়। :)
কোডেবল

6
public interface A{
    int x=65;
}
public interface B{
    int x=66;
}
public class D implements A,B {
    public static void main(String[] a){
        System.out.println(x); // which x?
    }
}

সমাধান এখানে।

System.out.println(A.x); // done

আমি মনে করি এটি ইন্টারফেস পরিবর্তনশীল স্থির হওয়ার এক কারণ।

ইন্টারফেসের ভিতরে ভেরিয়েবলগুলি ঘোষণা করবেন না।


3
প্রকৃতপক্ষে, "অক্ষ" ছাড়াই এটি সংকলনও করতে পারে না "সুতরাং ইন্টারফেসে ভেরিয়েবলগুলি (যা স্পষ্টতই পাবলিক স্ট্যাটিক চূড়ান্ত হয়) ব্যবহার করা নিরাপদ
মার্কো

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

5

স্থির - কারণ ইন্টারফেসের কোনও উদাহরণ থাকতে পারে না। এবং চূড়ান্ত - কারণ আমাদের এটি পরিবর্তন করার দরকার নেই।


15
"আমাদের দরকার নেই" == "আমাদের অনুমোদিত নয়", অর্থগুলি মিশ্রিত করবেন না।
পিটার -

3

কারণ:

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

Final : যাতে ভেরিয়েবলগুলির (ডায়মন্ড সমস্যা - একাধিক উত্তরাধিকার) জন্য আমাদের অস্পষ্ট মান না রাখা উচিত।

এবং ডকুমেন্টেশন ইন্টারফেস অনুযায়ী একটি চুক্তি এবং বাস্তবায়ন নয়।

রেফারেন্স: অভিষেক জৈনের উত্তর কোরায়ায়


2

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

 public interface IMyClass {

     void methodA();
     String methodB();
     Integer methodC();

 }

 public abstract class myAbstractClass implements IMyClass {
     protected String varA, varB;

     //Constructor
     myAbstractClass(String varA, String varB) {
         this.varA = varA;
         this.varB = VarB;
     }

     //Implement (some) interface methods here or leave them for the concrete class
     protected void methodA() {
         //Do something
     }

     //Add additional methods here which must be implemented in the concrete class
     protected abstract Long methodD();

     //Write some completely new methods which can be used by all subclasses
     protected Float methodE() {
         return 42.0;
     }

 }

 public class myConcreteClass extends myAbstractClass {

     //Constructor must now be implemented!
     myClass(String varA, String varB) {
         super(varA, varB);
     }

     //All non-private variables from the abstract class are available here
     //All methods not implemented in the abstract class must be implemented here

 }

আপনি যদি নিশ্চিত হন যে আপনি অন্য ইন্টারফেসের সাথে পরে এটি প্রয়োগ করতে চান না তবে আপনি কোনও ইন্টারফেস ছাড়াই একটি বিমূর্ত ক্লাসও ব্যবহার করতে পারেন। দয়া করে নোট করুন যে আপনি কোনও বিমূর্ত শ্রেণির উদাহরণ তৈরি করতে পারবেন না এটির আগে আপনাকে এটি প্রসারিত করা উচিত।

("সুরক্ষিত" কীওয়ার্ডটির অর্থ শুধুমাত্র বর্ধিত শ্রেণিগুলি এই পদ্ধতিগুলি এবং ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে))

spyro



1

ইন্টারফেস: সিস্টেমের প্রয়োজনীয় পরিষেবা।

ইন্টারফেসে ভেরিয়েবলটি সর্বজনীন, স্থির, চূড়ান্ত অ্যাক্সেস সংশোধক দ্বারা ডিফল্টরূপে নির্ধারিত হয় । কারণ :

সর্বজনীন: এমন কিছু সময় ঘটে থাকে যে ইন্টারফেসটি অন্য কোনও প্যাকেজে থাকতে পারে। সুতরাং প্রকল্পের যে কোনও জায়গা থেকে এটি ভেরিয়েবল অ্যাক্সেস করা দরকার।

স্থির: যেমন অসম্পূর্ণ শ্রেণি বস্তু তৈরি করতে পারে না। সুতরাং প্রকল্পে আমাদের অবজেক্ট ছাড়াই চলকটি অ্যাক্সেস করতে হবে যাতে আমরা এর সাহায্যে অ্যাক্সেস করতে পারিinterface_filename.variable_name

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


0

ইন Java, ইন্টারফেস আপনাকে কোনও ইনস্ট্যান্স ভেরিয়েবল ঘোষণা করতে দেয় না। একটি ইন্টারফেসে উদাহরণ ভেরিয়েবল হিসাবে ঘোষিত একটি ভেরিয়েবল ব্যবহার করা একটি সংকলন সময় ত্রুটি প্রদান করবে।

আপনি একটি ধ্রুবক ভেরিয়েবল ঘোষণা করতে পারেন, static finalযা উদাহরণের পরিবর্তনশীল থেকে পৃথক using


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

0

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


0

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


0

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

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

আমি স্থির রাখার চেষ্টা করেছি বা না কোনও পার্থক্য না। কোডটি নীচে রয়েছে:

public interface Addable {
    static int count = 6;

    public int add(int i);

}

public class Impl implements Addable {

    @Override
    public int add(int i) {
        return i+count;
    }
}

public class Test {

    public static void main(String... args) {
        Impl impl = new Impl();

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