কেন জাফায় ইন্টারফেস ভেরিয়েবলগুলি স্থির এবং চূড়ান্তভাবে ডিফল্ট হয়?
কেন জাফায় ইন্টারফেস ভেরিয়েবলগুলি স্থির এবং চূড়ান্তভাবে ডিফল্ট হয়?
উত্তর:
ফিলিপ শ এর জাভা ইন্টারফেস ডিজাইন এফএকিউ থেকে:
ইন্টারফেস ভেরিয়েবলগুলি স্থির কারণ জাভা ইন্টারফেসগুলি তাদের নিজস্বভাবে ইনস্ট্যান্ট করা যায় না; ভেরিয়েবলের মান অবশ্যই একটি স্থিতিশীল প্রসঙ্গে নির্ধারিত হতে হবে যেখানে কোনও উদাহরণ বিদ্যমান নেই। চূড়ান্ত পরিবর্তনকারী ইন্টারফেস ভেরিয়েবলের জন্য নির্ধারিত মানটি নিশ্চিত করে যে সত্যিকারের ধ্রুবক যা প্রোগ্রাম কোড দ্বারা পুনরায় বরাদ্দ করা যায় না।
static
সম্পূর্ণ উত্সাহজনক। কোনও শ্রেণীর পাবলিক ইনস্ট্যান্স ভেরিয়েবলগুলি এর ইন্টারফেসের অংশ এবং interface
উদাহরণস্বরূপ পদ্ধতিগুলির মতো এগুলি জাভাতে বিমূর্ত করা না যাওয়ার কোনও কারণ নেই । এটি interface
সরাসরি জাভা সরাসরি ইনস্ট্যান্ট করা যায় না তা বিবেচ্য নয় - আপনার এখনও ক্লাসগুলির উদাহরণ রয়েছে যা প্রয়োগ করে interface
এবং তাদের নির্দিষ্ট পাবলিক ইনস্ট্যান্স ভেরিয়েবলের প্রয়োজনীয়তা বোধগম্য। অংশ হিসাবে final
, এটি মোটেও কোনও ব্যাখ্যা দেয় না - এটি কেবল কী final
অর্থ বোঝায়।
ইন্টারফেসের যেহেতু প্রত্যক্ষ অবজেক্ট নেই, তাই তাদের অ্যাক্সেসের একমাত্র উপায় হ'ল একটি শ্রেণি / ইন্টারফেস ব্যবহার করে এবং এজন্যই যদি ইন্টারফেসের ভেরিয়েবলটি বিদ্যমান থাকে তবে এটি স্থিতিশীল হওয়া উচিত অন্যথায় এটি বাইরের পৃথিবীতে মোটেই অ্যাক্সেসযোগ্য হবে না। এখন যেহেতু এটি স্থিতিশীল, এটি কেবলমাত্র একটি মান রাখতে পারে এবং এটি প্রয়োগ করে এমন কোনও শ্রেণি এটি পরিবর্তন করতে পারে এবং তাই এটি সমস্ত বিভ্রান্ত হবে।
সুতরাং যদি কোনও ইন্টারফেস পরিবর্তনশীল হয় তবে এটি স্পষ্টতই স্থির, চূড়ান্ত এবং স্পষ্টতই প্রকাশ্য হবে !!!
interface
। একটি শ্রেণি ইন্টারফেসটি প্রয়োগ করবে, উদাহরণটি পরিবর্তনশীল হিসাবে ঘোষণা করবে (ইন্টারফেস দ্বারা প্রয়োজনীয় হিসাবে)। এর নির্মাতা (বা অন্যান্য পদ্ধতি) উদাহরণ পরিবর্তনশীল সেট করে। শ্রেণীর কোনও উদাহরণ ইনস্ট্যান্ট করা হলে আপনি এর উদাহরণ পরিবর্তনশীল অ্যাক্সেস করতে সক্ষম হবেন।
সর্বজনীন : ইন্টারফেসে উপস্থিত পদ্ধতিগুলির মতো সমস্ত শ্রেণি জুড়ে অ্যাক্সেসযোগ্যতার জন্য
স্ট্যাটিক : ইন্টারফেসের কোনও অবজেক্ট থাকতে পারে না বলে ইন্টারফেসনাম.ভ্যারেবলনেম এটি রেফারেন্স করতে বা এটি প্রয়োগকারী শ্রেণিতে সরাসরি ভেরিয়েবল নাম ব্যবহার করতে পারে।
চূড়ান্ত : তাদের ধ্রুবক করা। যদি 2 টি শ্রেণি একই ইন্টারফেস প্রয়োগ করে এবং আপনি উভয়কে মান পরিবর্তনের অধিকার প্রদান করেন, তবে বর্তমানের মানটিতে দ্বন্দ্ব দেখা দেবে, এ কারণেই কেবলমাত্র এক সময়ের সূচনা অনুমোদিত।
এছাড়াও এই সমস্ত সংশোধক একটি ইন্টারফেসের জন্য অন্তর্নিহিত, আপনার এগুলির কোনও নির্দিষ্ট করার দরকার নেই।
( এই দার্শনিক উত্তর না কিন্তু একটি ব্যবহারিক এক আরো )। 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
।
কারণ অন্য কিছু বাস্তবায়নের অংশ, এবং ইন্টারফেসে কোনও বাস্তবায়ন থাকতে পারে না।
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
আমি মনে করি এটি ইন্টারফেস পরিবর্তনশীল স্থির হওয়ার এক কারণ।
ইন্টারফেসের ভিতরে ভেরিয়েবলগুলি ঘোষণা করবেন না।
static final
পরিবর্তনশীলের আগে লিখিত দেখতে পাবেন না যা আসলে স্থির এবং চূড়ান্ত।
কারণ:
Static
: যেহেতু আমাদের ইন্টারফেসের অবজেক্ট থাকতে পারে না তাই আমাদের অবজেক্ট লেভেলের সদস্য ভেরিয়েবলগুলি এড়ানো উচিত এবং শ্রেণি স্তরের ভেরিয়েবলগুলি যেমন স্ট্যাটিক ব্যবহার করা উচিত।
Final
: যাতে ভেরিয়েবলগুলির (ডায়মন্ড সমস্যা - একাধিক উত্তরাধিকার) জন্য আমাদের অস্পষ্ট মান না রাখা উচিত।
এবং ডকুমেন্টেশন ইন্টারফেস অনুযায়ী একটি চুক্তি এবং বাস্তবায়ন নয়।
রেফারেন্স: অভিষেক জৈনের উত্তর কোরায়ায়
জাভা ইন্টারফেসে অ্যাবস্ট্রাক্ট ভেরিয়েবল এবং / অথবা কনস্ট্রাক্টর সংজ্ঞাগুলিকে মঞ্জুরি দেয় না। সমাধান: আপনার ইন্টারফেস এবং আপনার প্রয়োগের মধ্যে কেবল একটি বিমূর্ত শ্রেণিটি ঝুলিয়ে রাখুন যা কেবল বিমূর্ত শ্রেণীর ক্ষেত্রে প্রসারিত করে:
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
একটি ইন্টারফেস হ'ল দুটি পক্ষের মধ্যে চুক্তি যা আক্রমণকারী, প্রস্তর খোদাই করা, তাই চূড়ান্ত। চুক্তি অনুসারে নকশা দেখুন ।
ইন্টারফেস: সিস্টেমের প্রয়োজনীয় পরিষেবা।
ইন্টারফেসে ভেরিয়েবলটি সর্বজনীন, স্থির, চূড়ান্ত অ্যাক্সেস সংশোধক দ্বারা ডিফল্টরূপে নির্ধারিত হয় । কারণ :
সর্বজনীন: এমন কিছু সময় ঘটে থাকে যে ইন্টারফেসটি অন্য কোনও প্যাকেজে থাকতে পারে। সুতরাং প্রকল্পের যে কোনও জায়গা থেকে এটি ভেরিয়েবল অ্যাক্সেস করা দরকার।
স্থির: যেমন অসম্পূর্ণ শ্রেণি বস্তু তৈরি করতে পারে না। সুতরাং প্রকল্পে আমাদের অবজেক্ট ছাড়াই চলকটি অ্যাক্সেস করতে হবে যাতে আমরা এর সাহায্যে অ্যাক্সেস করতে পারিinterface_filename.variable_name
চূড়ান্ত: ধরা যাক একটি ইন্টারফেস অনেকগুলি ক্লাস দ্বারা প্রয়োগ করে এবং সমস্ত শ্রেণি ইন্টারফেস ভেরিয়েবল অ্যাক্সেস এবং আপডেট করার চেষ্টা করে। সুতরাং এটি ডেটা পরিবর্তনের সাথে বেমানান এবং অন্য প্রতিটি শ্রেণিকে প্রভাবিত করে। সুতরাং এটি চূড়ান্ত সহ অ্যাক্সেস পরিবর্তনকারী ঘোষণা করা প্রয়োজন।
ইন Java
, ইন্টারফেস আপনাকে কোনও ইনস্ট্যান্স ভেরিয়েবল ঘোষণা করতে দেয় না। একটি ইন্টারফেসে উদাহরণ ভেরিয়েবল হিসাবে ঘোষিত একটি ভেরিয়েবল ব্যবহার করা একটি সংকলন সময় ত্রুটি প্রদান করবে।
আপনি একটি ধ্রুবক ভেরিয়েবল ঘোষণা করতে পারেন, static final
যা উদাহরণের পরিবর্তনশীল থেকে পৃথক using
ইন্টারফেসটি যে কোনও শ্রেণি দ্বারা প্রয়োগ করা যেতে পারে এবং যদি মান প্রয়োগকারী শ্রেণীর যে কোনও একটি দ্বারা এটির মান পরিবর্তন হয়ে যায় তবে অন্যান্য প্রয়োগকারী শ্রেণীর জন্য বিভ্রান্তি ঘটতে পারে। ইন্টারফেসটি মূলত দুটি কোরলেটেড তবে পৃথক সত্তাকে একত্রিত করার জন্য একটি রেফারেন্স so তাই এজন্য ইন্টারফেসের অভ্যন্তরে ঘোষিত পরিবর্তনশীল স্পষ্টতই চূড়ান্ত এবং স্থিরও হবে কারণ ইন্টারফেস তাত্ক্ষণিক হতে পারে না।
এমন কোনও ওয়েব অ্যাপ্লিকেশনটির কথা চিন্তা করুন যেখানে আপনার ইন্টারফেস সংজ্ঞায়িত হয়েছে এবং অন্যান্য শ্রেণিগুলি এটি প্রয়োগ করে। আপনি ভেরিয়েবল অ্যাক্সেস করার জন্য ইন্টারফেসের উদাহরণ তৈরি করতে না পারায় আপনার একটি স্ট্যাটিক কীওয়ার্ড থাকা দরকার। যেহেতু এটির স্থিতিশীলতার সাথে মানটির কোনও পরিবর্তন তা প্রয়োগ করেছে এমন অন্যান্য দৃষ্টান্তগুলিতে প্রতিফলিত হবে। সুতরাং এটি প্রতিরোধ করার জন্য আমরা তাদের চূড়ান্ত হিসাবে সংজ্ঞায়িত করি।
সবেমাত্র 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));
}
}