আমি কেন একটি জাভা ইন্টারফেসে একটি স্থির পদ্ধতি সংজ্ঞায়িত করতে পারি না?


498

সম্পাদনা: জাভা 8 হিসাবে, স্ট্যাটিক পদ্ধতিগুলি এখন ইন্টারফেসগুলিতে অনুমোদিত।

উদাহরণটি এখানে:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}

অবশ্যই এটি কাজ করবে না। কিন্তু কেন না?

সম্ভাব্য সমস্যাগুলির মধ্যে একটি হ'ল, আপনি কল করলে কী ঘটে:

IXMLizable.newInstanceFromXML(e);

এই ক্ষেত্রে, আমি মনে করি এটি কেবল একটি খালি পদ্ধতি কল করা উচিত (যেমন।})। সমস্ত সাবক্লাস স্থিতিশীল পদ্ধতি প্রয়োগ করতে বাধ্য হবে, সুতরাং স্থির পদ্ধতিটি কল করার সময় তারা সকলেই ভাল থাকবেন। তাহলে কেন এটি সম্ভব নয়?

সম্পাদনা: আমি অনুমান করি যে আমি "কারণ এটি জাভা সেভাবেই" এর চেয়েও গভীর উত্তরটি খুঁজছি।

স্থির পদ্ধতিগুলি ওভাররাইট করা যায় না কেন এমন কোনও প্রযুক্তিগত কারণ রয়েছে? তা হ'ল, জাভার ডিজাইনাররা স্থিতির পদ্ধতি নয়, তবে উদাহরণের পদ্ধতিগুলি ওভাররাইডেবল করার সিদ্ধান্ত নিয়েছে?

সম্পাদনা: আমার ডিজাইনের সমস্যাটি হ'ল আমি কোডিং কনভেনশনটি প্রয়োগ করতে ইন্টারফেসগুলি ব্যবহার করার চেষ্টা করছি।

অর্থাৎ ইন্টারফেসের লক্ষ্যটি দ্বিগুণ:

  1. আমি চাই যে আইএক্সএমএলাইজেবল ইন্টারফেসটি আমাকে ক্লাসগুলি এক্সএমএল উপাদানগুলিতে রূপান্তর করতে অনুমতি দেয় (পলিমারফিজম ব্যবহার করে, সূক্ষ্মভাবে কাজ করে)।

  2. যদি কেউ IXMLizable ইন্টারফেস প্রয়োগ করে এমন কোনও শ্রেণীর একটি নতুন উদাহরণ তৈরি করতে চান, তবে তারা সর্বদা জানতে পারবেন যে সেখানে একটি নতুনInstanceFromXML (উপাদান ই) স্ট্যাটিক কনস্ট্রাক্টর থাকবে।

ইন্টারফেসে কেবল একটি মন্তব্য দেওয়া ছাড়া এটি কি নিশ্চিত করার অন্য কোনও উপায় আছে?


4
বিটিডব্লিউ, ইন্টারফেসে জনসাধারণের সাথে আপনার বিশৃঙ্খলা পদ্ধতি (এবং ক্ষেত্র) সংজ্ঞা দেওয়ার দরকার নেই।
টম হাটিন -

হুম, মনে হচ্ছে এটি স্ট্যাকওভারফ্লো / প্রশ্ন / 21817/… এর সদৃশ । এর আগে দেখিনি।
মাইকেল ম্যাইইয়ার্স

1
আপনি কীভাবে স্থির ইন্টারফেস পদ্ধতি ব্যবহার করতে চান এমন কিছু কোড সরবরাহ করতে পারেন?
পাভেল ফিল্ডম্যান

43
জাভা 8 এ এটি সম্ভব হবে: ডকস.অরাকল.কম
জাভাসে

1
@ দক্ষিণাং হ্যাঁ, তবে এটি ওপি যা চায় তা করে না।
ব্যবহারকারী 253751

উত্তর:


518

জাভা 8 স্থিতিশীল ইন্টারফেস পদ্ধতির অনুমতি দেয়

জাভা 8 সঙ্গে, ইন্টারফেসগুলি করতে স্ট্যাটিক পদ্ধতি আছে। তাদের কাছে কংক্রিট উদাহরণ পদ্ধতি থাকতে পারে তবে উদাহরণ ক্ষেত্রগুলি নয়।

এখানে সত্যিই দুটি প্রশ্ন আছে:

  1. কেন, খারাপ পুরানো সময়ে, ইন্টারফেসগুলিতে স্থির পদ্ধতি থাকতে পারে না?
  2. স্থির পদ্ধতিগুলি কেন ওভাররাইড করা যায় না?

ইন্টারফেসে স্থির পদ্ধতি

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

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

স্থির পদ্ধতিগুলি ওভাররাইড করা

দ্বিতীয় প্রশ্নের উত্তর কিছুটা জটিল।

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

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

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

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

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


নির্মাণকারী "ইন্টারফেস"

প্রশ্নের সাম্প্রতিক সম্পাদনাটি সম্বোধন করার জন্য এখানে আরও কিছু উপাদান রয়েছে।

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

class Foo implements IXMLizable<Foo> {
  public static Foo newInstanceFromXML(Element e) { ... }
}

Foo obj = Foo.newInstanceFromXML(e);

যেহেতু Fooনতুন অবজেক্টটি "নির্মাণ" করার সময় আপনাকে স্পষ্টভাবে কংক্রিটের নামকরণ করতে হবে , তাই সংকলকটি যাচাই করতে পারে যে এটিতে প্রয়োজনীয় কারখানার পদ্ধতি রয়েছে। এবং যদি এটি না হয়, তাই কি? আমি একজন বাস্তবায়ন করতে পারেন IXMLizableযে, "কনস্ট্রাকটর" অভাব আছে, এবং আমি একটি দৃষ্টান্ত তৈরি করুন এবং আপনার কোড তা পাস, এটা হল একটি IXMLizableপ্রয়োজনীয় সকল ইন্টারফেসের সাথে।

নির্মাণ বাস্তবায়ন অংশ, ইন্টারফেস নয়। ইন্টারফেসের সাথে সাফল্যের সাথে কাজ করে এমন কোনও কোড কনস্ট্রাক্টরকে পাত্তা দেয় না। যে কোনও কোড যা কনস্ট্রাক্টরকে যত্ন করে তা কোনওভাবেই কংক্রিটের প্রকারটি জানতে হবে এবং ইন্টারফেসটিকে উপেক্ষা করা যেতে পারে।


প্রজেক্ট কয়েনে শুভ কল। mail.openjdk.java.net/pipermail/coin-dev/2009-
মাইকেল মায়ার্স

12
# 1 এর জন্য একাধিক উত্তরাধিকার হতে পারে? যেহেতু আমরা একাধিক ইন্টারফেস থেকে উত্তরাধিকারী হতে পারি, যদি দুটি ইন্টারফেসে একই স্ট্যাটিক পদ্ধতির স্বাক্ষর থাকে এবং তারপরে কোনও শ্রেণি সেগুলি উভয়ই প্রয়োগ করে এবং সেই পদ্ধতিটিকে ডাকে, তবে জিনিসগুলি এমনভাবে জটিল হয়ে উঠতে পারে যা জাভা ভাষার স্রষ্টা একাধিক শ্রেণীর উত্তরাধিকারকে অস্বীকার করে এড়াতে চেয়েছিলেন প্রথম স্থান. ইন্টারফেসের জন্য স্পষ্টতই একই যুক্তি তৈরি করা যেতে পারে তাদের মধ্যে কোনও পদ্ধতির সংজ্ঞা দেওয়ার অনুমতি নেই।
shrini1000

1
@ shrini1000 - না, স্থির পদ্ধতিগুলি সংকলনের সময়ে সমাধান করা হয়। অস্পষ্টতাকে একইভাবে পরিচালনা করা যায় যেভাবে এটি ধ্রুবকগুলির সাথে পরিচালনা করা হয়: একটি সংকলক ত্রুটির সাথে। তবে কিছু অপ্রত্যাশিত অসুবিধার কারণ উল্লেখ করে প্রকল্প কয়েনের আওতাধীন প্রস্তাবটি প্রত্যাখ্যান করা হয়েছিল। তারা কী ছিল তা নিশ্চিত নয়, তবে আমি মনে করি না যে এটি এই লাইনের সাথে ছিল।
এরিকসন

1
@ tgm1024 হ্যাঁ, "কনস্ট্রাক্টর 'ইন্টারফেস" বিভাগটি ব্যাখ্যা করে যে সংকলনের সময় পরিচিত কোনও প্রকারের মাধ্যমে পলিমারফিক আচরণের চেষ্টা করা কেন বুদ্ধিমান হয় না। আপনি RESET()একটি প্রদত্ত শ্রেণিতে কীভাবে প্রার্থনা করবেন ? আপনি লিখবেন SomeClass.RESET()। সুতরাং সেই এপিআই বর্ণনা করতে আপনার কোনও ইন্টারফেসের দরকার নেই; এটি স্থির। সংকলন-সময় আপনি যখন কংক্রিটের প্রকারটি জানেন না তখন ইন্টারফেসগুলি ব্যবহৃত হয়। স্থির পদ্ধতিতে এটি কখনও হয় না।
ইরিকসন

2
"নির্মাণ বাস্তবায়নের অংশ, ইন্টারফেস নয়। ইন্টারফেসের সাথে সফলভাবে কাজ করা কোনও কোড কনস্ট্রাক্টরকে পাত্তা দেয় না।" - এটা স্পষ্টভাবে সত্য নয়। অন্যান্য ভাষায় (যেমন: সুইফ্ট), আমি স্থিতিশীলভাবে Tনা জেনে নতুন উদাহরণ তৈরি করতে পারি T, কারণ আমি একটি ইন্টারফেসে প্রতিশ্রুতি দিয়েছি যে রানটাইমের সময় একটি নির্দিষ্ট নির্মাণকারী (বা স্থির পদ্ধতি) উপস্থিত থাকবে। জাভাতে প্রজন্ম নির্দিষ্ট করা অসম্ভব এই বিষয়টি যে এটি করা অর্থপূর্ণ জিনিস তা নয় meaning
রাফেল

48

এটি ইতিমধ্যে এখানে জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছিল

আমার উত্তর সদৃশ করতে:

কোনও ইন্টারফেসে স্থির পদ্ধতি ঘোষণা করার মতো কোনও বিষয় নেই। এগুলি সাধারণ কল MyInterface.staticMethod () দ্বারা কার্যকর করা যায় না। আপনি যদি প্রয়োগকারী ক্লাস মাইআইম্পিমেন্টার.স্ট্যাটিকমিথড () নির্দিষ্ট করে তাদের আহ্বান করেন তবে আপনাকে অবশ্যই প্রকৃত শ্রেণিটি জানতে হবে, সুতরাং ইন্টারফেসটিতে এটি রয়েছে কিনা তা অপ্রাসঙ্গিক।

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

MyInterface var = new MyImplementingClass();
var.staticMethod();

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

আপনি "ফলাফল = MyInterface.staticMethod ()" সম্পাদন করতে না পারার কারণটি হ'ল মাই ইন্টারফেসে সংজ্ঞায়িত পদ্ধতির সংস্করণটি প্রয়োগ করতে হবে। তবে মাই ইন্টারফেসে কোনও সংস্করণ সংজ্ঞায়িত করা যায় না, কারণ এটি একটি ইন্টারফেস। সংজ্ঞা অনুসারে এর কোড নেই।

যদিও আপনি বলতে পারেন যে এটি "কারণ জাভা সেভাবে এটি করে" এর পরিমাণ রয়েছে, বাস্তবে সিদ্ধান্তটি অন্যান্য ডিজাইনের সিদ্ধান্তগুলির যৌক্তিক পরিণতি, খুব ভাল কারণেও হয়েছিল।


14
আপনি যদি জেনেরিক ধরণের প্যারামিটার হিসাবে <টি মাই ইনটারফেস> প্রসারিত করেন তবে ইন্টারফেসের মাধ্যমে গ্যারান্টি দেওয়া ভাল হবে যে টি .ডোসোমিংথিং () করতে পারে।
ক্রিস বেটি

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

@ জুহ_, ..... অথবা একেবারে প্রয়োজনে একটি নতুন কীওয়ার্ড। আমি বিশ্বাস করি staticযেভাবেই ভাষাগুলিতে একটি ক্ষুধার্ত শব্দ, এবং এটি এখন পর্যন্ত অনেকটা প্রসারিত হয়েছে। সুতরাং এটি নিজের দ্বারা এটি ইতিমধ্যে স্কেচিযুক্ত। উপরের আমার উদাহরণ দেখুন stackoverflow.com/questions/512877/… rug শ্রাগ}।

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

1
"কোনও ইন্টারফেসে স্থির পদ্ধতি ঘোষণা করার মতো কোনও বিষয় নেই" " এটি সত্য নয়: কল্পনা করুন আপনার সিস্টেমে একটি ডিফল্ট শ্রেণীর সমাধানকারী রয়েছে। যদি এটি সনাক্ত করে যে আপনি কনটেইনারআইজেকশনআইটারস :: ক্রিয়েট (কনটেইনার $ ধারক) পদ্ধতিটি প্রয়োগ করেন তবে এটি উদাহরণস্বরূপ এই ফাংশনটির সাথে অবজেক্টটি তৈরি করবে।
ব্যবহারকারী 3790897

37

সাধারণত এটি একটি কারখানার নিদর্শন ব্যবহার করে করা হয়

public interface IXMLizableFactory<T extends IXMLizable> {
  public T newInstanceFromXML(Element e);
}

public interface IXMLizable {
  public Element toXMLElement();
}

7
+1 একটি কারখানার নিদর্শন সমস্যার সমাধানের মতো মনে হচ্ছে। (যদিও প্রশ্নটি নয়)
pvgoddijn

কেউ আমাকে বলতে পারেন যে এখানে <টি IXMLizable প্রসারিত করার অর্থ কী? আমি জাভাতে নতুন। এটি কী করে?
নুয়ান হর্ষকুমারা পিয়রথ্না

1
@ নুয়ান হর্ষকুমার পিয়ারথনা টি অবশ্যই IXMLizable বর্ধিত একটি শ্রেণি হতে হবে। এর অর্থ কী তা আরও ভাল করে বোঝার জন্য জাভা জেনেরিকগুলিতে সন্ধান করুন
অ্যাড্রিয়ান

37

জাভা 8 এর আবির্ভাবের সাথে ইন্টারফেসে এখন ডিফল্ট এবং স্থির পদ্ধতিগুলি লেখা সম্ভব । docs.oracle/staticMethod

উদাহরণ স্বরূপ:

public interface Arithmetic {

    public int add(int a, int b);

    public static int multiply(int a, int b) {
        return a * b;
    }
}
public class ArithmaticImplementation implements Arithmetic {

    @Override
    public int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = Arithmetic.multiply(2, 3);
        System.out.println(result);
    }
}

ফলাফল : 6

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


এটি এই প্রশ্নের একটি নিখুঁত উদাহরণ।

21

কারণ স্ট্যাটিক পদ্ধতিগুলি সাবক্লাসগুলিতে ওভাররাইড করা যায় না এবং তাই এগুলি বিমূর্ত হতে পারে না। এবং একটি ইন্টারফেসের সমস্ত পদ্ধতি হ'ল , বাস্তব , বিমূর্ত।


2
আপনি সর্বদা যে কোনও স্ট্যাটিক ইন্টারফেস পদ্ধতি প্রয়োগ করতে প্রতিটি ধরণেরকে বাধ্য করতে পারেন। টাইপ ক্লাস, কেউ?
মাইকেলজিজি

16
নিজের বাইরে গিয়ে এই প্রশ্নের উত্তর দিন: স্থির পদ্ধতিগুলি কেন ওভাররাইড করা যায় না? স্থির পদ্ধতিগুলি যদি ওভাররাইড করা যায় তবে এটি দেখতে কেমন হবে? আপনি তাদের সাথে কি করতে পারেন? এই উত্তরটি মূলত "আপনি পারবেন না বলে আপনি করতে পারবেন না"।
এরিকসন

10

আমি কেন একটি জাভা ইন্টারফেসে একটি স্থির পদ্ধতি সংজ্ঞায়িত করতে পারি না?

আসলে আপনি জাভা 8 এ পারবেন।

জাভা ডক হিসাবে :

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

জাভা 8-এ একটি ইন্টারফেসের ডিফল্ট পদ্ধতি এবং স্থিতিশীল পদ্ধতি থাকতে পারে । এটি আমাদের জন্য আমাদের লাইব্রেরিতে সহায়ক পদ্ধতিগুলি সংগঠিত করা সহজ করে তোলে। আমরা পৃথক শ্রেণীর পরিবর্তে একই ইন্টারফেসের একটি ইন্টারফেসের সাথে নির্দিষ্ট স্ট্যাটিক পদ্ধতি রাখতে পারি।

ডিফল্ট পদ্ধতির উদাহরণ:

list.sort(ordering);

পরিবর্তে

Collections.sort(list, ordering);

স্থির পদ্ধতির উদাহরণ ( নিজেই ডক থেকে ):

public interface TimeClient {
    // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }    
}

6

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


পরিষ্কার, সংক্ষিপ্ত যুক্তি। ভাল করা.
ওকে উয়েচিউ

6

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

দ্বিতীয়ত, আমরা স্থিতিশীল পদ্ধতিগুলি যে সকল উপায়ে ব্যবহার করি তাতে একটি ইন্টারফেস প্যাটার্ন থাকার স্থায়ী পদ্ধতি রয়েছে যার মধ্যে স্থির পদ্ধতি রয়েছে - আমি আপনার কারও পক্ষে কথা বলতে পারি না, তবে আমি নিয়মিত স্থিতিশীল পদ্ধতি ব্যবহার করি।

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


5

স্থির পদ্ধতিগুলি উদাহরণের মতো পদ্ধতিগুলির মতো ভার্চুয়াল নয় তাই আমি মনে করি জাভা ডিজাইনাররা সিদ্ধান্ত নিয়েছেন যে তারা ইন্টারফেসে সেগুলি চান না।

তবে আপনি ইন্টারফেসের ভিতরে স্থিতিশীল পদ্ধতিযুক্ত ক্লাস রাখতে পারেন। আপনি যে চেষ্টা করতে পারে!

public interface Test {
    static class Inner {
        public static Object get() {
            return 0;
        }
    }
}

5
  • "স্থির পদ্ধতিগুলি ওভাররাইড করা যায় না এমন কোনও কারণ আছে কি"?

সংজ্ঞাগুলি পূরণ করে আপনার প্রশ্নটির পুনরায় কথা বলি।

  • "সংকলনের সময় সমাধান করা পদ্ধতিগুলি রানটাইম সময়ে সমাধান করা যায় না এমন কোনও কারণ আছে কি?"

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


3

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

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

cmd = createCmd(Person.getCreateCmdId());
Person p = cmd.execute();

এবং আপনি যে আইডি দ্বারা কোনও ব্যক্তি লোড করতে পারেন

cmd = createCmd(Person.getGetCmdId());
cmd.set(ID, id);
Person p = cmd.execute();

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

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


3

মন্তব্য EDIT: As of Java 8, static methods are now allowed in interfaces.

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


2

ঠিক আছে, জেনারিক ব্যতীত স্ট্যাটিক ইন্টারফেসগুলি অকেজো কারণ সমস্ত স্থির পদ্ধতি কলগুলি সংকলনের সময়ে সমাধান করা হয়। সুতরাং, তাদের কোন বাস্তব ব্যবহার আছে।

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


1
জেনারিকদের এর সাথে কী করার আছে? একটি ইন্টারফেসের স্থিতিশীল পদ্ধতিটি এখনও অনর্থক হতে পারে।
ডিজেক্লেওয়ার্থ

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

2
Why can't I define a static method in a Java interface?

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


1

একটি ইন্টারফেস কখনও স্ট্যাটিক্যালি উপস্থাপন করা যাবে না, যেমন ISomething.member। একটি ইন্টারফেস সর্বদা একটি ভেরিয়েবলের মাধ্যমে ডিফারেন্স করা হয় যা ইন্টারফেসের একটি সাবক্লাসের উদাহরণকে বোঝায়। সুতরাং, একটি ইন্টারফেস রেফারেন্স কখনই বুঝতে পারে না যে এটি সাবক্লাসটি তার সাবক্লাসের উদাহরণ ছাড়াই উল্লেখ করে।

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

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

একটি ইন্টারফেসে একটি পরিবর্তনীয় স্থিতিশীল ক্ষেত্র পাওয়ার উপায়টি হল একটি উপস্থায় যে স্ট্যাটিক ক্ষেত্রটি অ্যাক্সেস করতে একটি ইন্টারফেসে অ-স্থিতিশীল গেটর এবং সেটার পদ্ধতিগুলি ব্যবহার করা হয়। সিডনোট, স্পষ্টতই অপরিবর্তনীয় স্ট্যাটিক্স জাভা ইন্টারফেসে এর সাথে ঘোষণা করা যেতে পারে static final


0

ইন্টারফেসগুলি কেবল শ্রেণি সরবরাহ করবে এমন জিনিসগুলির একটি তালিকা সরবরাহ করে, সেই জিনিসগুলির প্রকৃত বাস্তবায়ন নয়, যা আপনার স্ট্যাটিক আইটেমটি।

আপনি যদি স্ট্যাটিকস চান, একটি বিমূর্ত শ্রেণি ব্যবহার করুন এবং এটি উত্তরাধিকারী করুন, অন্যথায়, স্ট্যাটিক সরান।

আশা করি এইটি কাজ করবে!


2
ঠিক আছে, তাত্ত্বিকভাবে, আপনি একটি স্থিতিশীল আচরণ অন্তর্ভুক্ত করার জন্য একটি ইন্টারফেস সংজ্ঞায়িত করতে পারেন, অর্থাৎ, "এই ইন্টারফেসের বাস্তবায়নে এই স্বাক্ষর সহ একটি স্থির পদ্ধতি foo () থাকবে" এবং প্রয়োগটি নির্দিষ্ট শ্রেণিতে ছেড়ে দেওয়া হবে। আমি এমন পরিস্থিতিতে পড়েছি যেখানে এই আচরণটি কার্যকর হবে।
রব

0

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

তবে আপনি চাইলে এটি করতে পারেন:

public class A {
  public static void methodX() {
  }
}

public class B extends A {
  public static void methodX() {
  }
}

এক্ষেত্রে আপনার কাছে দুটি ক্লাস যা 2 টি পৃথক স্ট্যাটিক পদ্ধতি সহ মেথেক্সএক্স () নামে পরিচিত।


0

ধরুন আপনি এটি করতে পারতেন; এই উদাহরণ বিবেচনা করুন:

interface Iface {
  public static void thisIsTheMethod();
}

class A implements Iface {

  public static void thisIsTheMethod(){
    system.out.print("I'm class A");
  }

}

class B extends Class A {

  public static void thisIsTheMethod(){
    System.out.print("I'm class B");
  } 
}

SomeClass {

  void doStuff(Iface face) {
    IFace.thisIsTheMethod();
    // now what would/could/should happen here.
  }

}

1
এটি "আমি ক্লাস এ" মুদ্রণ করবে। তবে, আপনি টাইপ A.thisIsTheMethod()করলে এটি "আমি ক্লাস বি" মুদ্রণ করবে।
সিডিএমকেই

তবে ওয়র ইন্টারফেসে পদ্ধতিগুলি কল করে আপনি (বা সংকলক) কীভাবে জানতে পারবেন কোন পদ্ধতিটি বলা উচিত? (আরও বেশি ক্লাস থাকতে পারে র‌্যাঙ্কিংয়ে ইফেস বাস্তবায়ন করতে পারে
pvgoddijn

দুঃখিত, আমি বলতে চাইছিলাম: তবে আপনি যদি টাইপ করেন তবে B.thisIsTheMethod()এটি "আমি ক্লাস বি" মুদ্রণ করব।
সিডিএমকেই

আমি বলেছিলাম আইফিস.এইচটি মেথড উদ্দেশ্য অনুসারে কারণ এতে সমস্যা রয়েছে।
অপরিজ্ঞাত

0

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

SI si = clazz.getStatic(SI.class); // null if clazz doesn't implement SI
// alternatively if the class is known at compile time
SI si = Someclass.static.SI; // either compiler errror or not null

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


0

আমি যখন বুঝতে পারি যে জাভা 8 এই সমস্যাটির সমাধান করে, আমি ভেবেছিলাম যে আমি বর্তমানে একটি দৃশ্য নিয়ে কাজ করছি (জাভা 7 ব্যবহার করে লক হয়েছি) যেখানে কোনও ইন্টারফেসে স্থির পদ্ধতি নির্দিষ্ট করতে সক্ষম হওয়া সহায়ক হবে।

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

এখানে আমার পয়েন্ট চিত্রিত কোড।

ইন্টারফেস সংজ্ঞা:

public interface IGenericEnum <T extends Enum<T>> {
    String getId();
    String getDisplayName();
    //If I was using Java 8 static helper methods would go here
}

একটি এনাম সংজ্ঞা উদাহরণ:

public enum ExecutionModeType implements IGenericEnum<ExecutionModeType> {
    STANDARD ("Standard", "Standard Mode"),
    DEBUG ("Debug", "Debug Mode");

    String id;
    String displayName;

    //Getter methods
    public String getId() {
        return id;
    }

    public String getDisplayName() {
        return displayName;
    }

    //Constructor
    private ExecutionModeType(String id, String displayName) {
        this.id = id;
        this.displayName = displayName;
    }

    //Helper methods - not enforced by Interface
    public static boolean isValidId(String id) {
        return GenericEnumUtility.isValidId(ExecutionModeType.class, id);
    }

    public static String printIdOptions(String delimiter){
        return GenericEnumUtility.printIdOptions(ExecutionModeType.class, delimiter);
    }

    public static String[] getIdArray(){
        return GenericEnumUtility.getIdArray(ExecutionModeType.class);
    }

    public static ExecutionModeType getById(String id) throws NoSuchObjectException {
        return GenericEnumUtility.getById(ExecutionModeType.class, id);
    }
}

জেনেরিক এনাম ইউটিলিটি সংজ্ঞা:

public class GenericEnumUtility {
    public static <T extends Enum<T> & IGenericEnum<T>> boolean isValidId(Class<T> enumType, String id) {       
        for(IGenericEnum<T> enumOption : enumType.getEnumConstants()) {
            if(enumOption.getId().equals(id)) {
                return true;
            }
        }

        return false;
    }

    public static <T extends Enum<T> & IGenericEnum<T>> String printIdOptions(Class<T> enumType, String delimiter){
        String ret = "";
        delimiter = delimiter == null ? " " : delimiter;

        int i = 0;
        for(IGenericEnum<T> enumOption : enumType.getEnumConstants()) {
            if(i == 0) {
                ret = enumOption.getId();
            } else {
                ret += delimiter + enumOption.getId();
            }           
            i++;
        }

        return ret;
    }

    public static <T extends Enum<T> & IGenericEnum<T>> String[] getIdArray(Class<T> enumType){
        List<String> idValues = new ArrayList<String>();

        for(IGenericEnum<T> enumOption : enumType.getEnumConstants()) {
            idValues.add(enumOption.getId());
        }

        return idValues.toArray(new String[idValues.size()]);
    }

    @SuppressWarnings("unchecked")
    public static <T extends Enum<T> & IGenericEnum<T>> T getById(Class<T> enumType, String id) throws NoSuchObjectException {
        id = id == null ? "" : id;
        for(IGenericEnum<T> enumOption : enumType.getEnumConstants()) {
            if(id.equals(enumOption.getId())) {
                return (T)enumOption;
            }
        }

        throw new NoSuchObjectException(String.format("ERROR: \"%s\" is not a valid ID. Valid IDs are: %s.", id, printIdOptions(enumType, " , ")));
    }
}

0

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

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

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

Metaclass এই উদ্দেশ্যে পরিবেশন করা হয়। আপনি জাভা ক্লাস ক্লাস চেষ্টা করতে পারেন। তবে সমস্যাটি হ'ল জাভা এর পক্ষে যথেষ্ট নমনীয় নয়। আপনি কোনও ইন্টারফেসের ক্লাস অবজেক্টে কোনও পদ্ধতি ঘোষণা করতে পারবেন না।

এটি একটি মেটা ইস্যু - যখন আপনাকে গাধা করা দরকার

..ব্লাহ ব্লাহ

যাইহোক আপনার একটি সহজ কাজ আছে - একই যুক্তি দিয়ে পদ্ধতিটিকে অ স্থিতিশীল করে তুলছে। তবে তারপরে আপনাকে প্রথমে পদ্ধতিটি কল করতে একটি অবজেক্ট তৈরি করতে হবে।


0

এটি সমাধানের জন্য: ত্রুটি: অনুপস্থিত পদ্ধতি বডি, বা বিমূর্ত স্ট্যাটিক শূন্য মূল (স্ট্রিং [] আরগস) ঘোষণা করুন;

interface I
{
    int x=20;
    void getValue();
    static void main(String[] args){};//Put curly braces 
}
class InterDemo implements I
{
    public void getValue()
    {
    System.out.println(x);
    }
    public static void main(String[] args)
    {
    InterDemo i=new InterDemo();
    i.getValue();   
    }

}

আউটপুট: 20

এখন আমরা ইন্টারফেসে স্থির পদ্ধতি ব্যবহার করতে পারি


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

-2

আমি মনে করি জাভাতে স্থির ইন্টারফেস পদ্ধতি নেই কারণ আপনার এগুলির দরকার নেই। আপনি ভাবতে পারেন আপনি করছেন, কিন্তু ... আপনি কীভাবে এগুলি ব্যবহার করবেন? আপনি চাইলে তাদের মত কল করুন

MyImplClass.myMethod()

তাহলে আপনাকে ইন্টারফেসে এটি ঘোষণা করার দরকার নেই। আপনি চাইলে তাদের মত কল করুন

myInstance.myMethod()

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

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

MyImplClass.myMethod()

প্রতিটি ইন্টারফেস বাস্তবায়নের এই পদ্ধতিটি রয়েছে তার উপর নির্ভর করে না, সুতরাং এটির সাথে নিশ্চিত হতে আপনাকে জাভা দরকার নেই।


-5

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

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