জাভা প্রতিনিধিরা?


194

জাভা ভাষার কি প্রতিনিধি বৈশিষ্ট্য রয়েছে, যেমন সি # এর প্রতিনিধিদের পক্ষে সমর্থন কী?


20
@ সুমা আপনার উল্লিখিত প্রশ্নটি যদি এর এক বছর পরে পোস্ট করা হয় তবে এটি কীভাবে সদৃশ হতে পারে?
অনি

1
জাভা 8 এর বেশিরভাগ প্রতিনিধিদের মতো বৈশিষ্ট্য রয়েছে। একে ল্যাম্বডাস বলা হয়।
tbodt

4
@ টিবিডট আরও সঠিক হতে হবে, জাভা 8 -এর বেশিরভাগ প্রতিনিধিদের মতো বৈশিষ্ট্য রয়েছে। একে ফাংশনাল ইন্টারফেস বলে । ল্যাম্বডাস হ'ল এই জাতীয় প্রতিনিধিদের উদাহরণ তৈরি করার একটি উপায় (বেনামে)।
নওফাল

3
নীচের উত্তরগুলি পূর্ব-জাভা 8 এর থেকে রয়েছে 8 জাভা পোস্ট করুন 8 এই থ্রেডের উত্তরগুলি দেখুন: স্ট্যাকওভারফ্লো
মাইকেল লয়েড লি

@ নওফাল, +1, তবে আরও সঠিক হতে হবে, জাভা 7 এবং নীচে ইতিমধ্যে বেশ কিছু প্রতিনিধিদের মতো বৈশিষ্ট্য রয়েছে। একে প্লেইন ইন্টারফেস বলে।
পেসেরিয়র

উত্তর:


152

আসলেই না, না।

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

আপনি এই নিবন্ধটি আকর্ষণীয় / দরকারীও পেতে পারেন: একটি জাভা প্রোগ্রামার সি # প্রতিনিধিদের কাছে দেখছেন (@ সংরক্ষণাগার.অর্গ)


3
ইন্টারফেসের একমাত্র সদস্য ফাংশন হিসাবে আহ্বান () সহ সমাধানটি খুব সুন্দর।
স্টিফেন রোল্যান্ড

1
কিন্তু আমার উদাহরণ দেখতে এখানে এক করতে হবে কি, জাভা 7 এমনকি, একটি সি # প্রতিনিধি সমতূল্য সম্পন্ন করার জন্য।
টুলমেকারস্টেভ

63

আপনি যা বলতে চান তার অবিকল উপর নির্ভর করে আপনি কৌশল প্যাটার্নটি ব্যবহার করে অনুরূপ প্রভাব অর্জন করতে পারেন (কোনও পদ্ধতি অবলম্বন করে)।

এর পরিবর্তে কোনও রেখার পরিবর্তে নামকরণের পদ্ধতিটির স্বাক্ষর ঘোষণা করে:

// C#
public delegate void SomeFunction();

একটি ইন্টারফেস ঘোষণা:

// Java
public interface ISomeBehaviour {
   void SomeFunction();
}

পদ্ধতির কংক্রিট বাস্তবায়নের জন্য, এমন একটি শ্রেণি নির্ধারণ করুন যা আচরণটি কার্যকর করে:

// Java
public class TypeABehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeA behaviour
   }
}

public class TypeBBehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeB behaviour
   }
}

তারপরে যেখানেই আপনার SomeFunction# # তে প্রতিনিধি থাকতেন , তার ISomeBehaviourপরিবর্তে একটি রেফারেন্স ব্যবহার করুন:

// C#
SomeFunction doSomething = SomeMethod;
doSomething();
doSomething = SomeOtherMethod;
doSomething();

// Java
ISomeBehaviour someBehaviour = new TypeABehaviour();
someBehaviour.SomeFunction();
someBehaviour = new TypeBBehaviour();
someBehaviour.SomeFunction();

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

// Java
public void SomeMethod(ISomeBehaviour pSomeBehaviour) {
   ...
}

...

SomeMethod(new ISomeBehaviour() { 
   @Override
   public void SomeFunction() {
      // your implementation
   }
});

এটি সম্ভবত তখনই ব্যবহার করা উচিত যখন বাস্তবায়ন বর্তমান প্রসঙ্গে খুব সুনির্দিষ্ট থাকে এবং পুনরায় ব্যবহার থেকে কোনও উপকার হয় না।

এবং তারপরে অবশ্যই জাভা 8-এ, এগুলি মূলত ল্যাম্বডা অভিব্যক্তিতে পরিণত হয়:

// Java 8
SomeMethod(() -> { /* your implementation */ });

6
+1 টি। এটি একটি শালীন কাজ এবং ভবিষ্যতে রক্ষণাবেক্ষণের দ্বারা ভার্বোসিকে ক্ষতিপূরণ দেওয়া যেতে পারে।
নওফাল

এটি দুর্দান্ত ... বর্তমানে প্রকল্পে কাজ করছি যেখানে আমি প্রকল্পের বাধার কারণে প্রতিচ্ছবি ব্যবহার করতে পারছি না এবং এই কাজটি সুন্দরভাবে কাজটি পেয়েছে :)
জোনাথন কামারেনা

ইন্টারফেসের জন্য জাভাতে কি আই-প্রিফিক্স নামকরণের কনভেনশন রয়েছে? আমি এর আগে দেখিনি
কাইল ডেলানি

36

ছোট গল্প: না

ভূমিকা

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

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

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

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


যেমনটি বলা হয়েছে যে প্যাট্রিকের সাথে আপনি কী যুক্ত করেছেন তার পরিবর্তে আপনি অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করতে চান।
এসসিডিএফ

16
দুর্দান্ত নিবন্ধ। আমি তাদের "সরল" এর সংজ্ঞাটি পছন্দ করি: জাভা একটি সহজ ভাষা হিসাবে তৈরি করা হয়েছে যেমন "জাভা এর জন্য সংকলক / ভিএম লিখতে সহজ হতে হবে" যখন "জাওয়াকে একজন ব্যক্তির দ্বারা লিখতে / পড়তে সহজ হতে হবে" । অনেক ব্যাখ্যা করে
জুউজাস কনটভেইনিস

5
আমি কেবল মনে করি এসইএন একটি দুর্দান্ত ভুল করেছে। তারা কেবল কার্যকরী দৃষ্টান্ত দ্বারা বিশ্বাসী হন নি, এবং এগুলিই।
স্টিফেন রোল্যান্ড

7
@ জুউজাস: পাইথনটি স্পষ্টভাবে কোনও ব্যক্তির লেখা / পড়ার জন্য সহজ করে তোলে এবং এটি ল্যাম্বদা ফাংশন / প্রতিনিধি প্রয়োগ করে
স্টিফেন রোল্যান্ড

5
একটি আর্কাইভ.org লিঙ্ক দিয়ে প্রতিস্থাপন করা হয়েছে। এছাড়াও, এটি সত্যই বোকা, ওরাকল।
প্যাট্রিক 20

18

আপনি পড়া আছে এই :

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

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

obj.registerHandler (ano.methodOne);

.. এবং যে পদ্ধতিটি নির্দিষ্ট সময়ে কোনও নির্দিষ্ট ইভেন্ট গৃহীত হলে তাকে একবার ডাকতে হবে।

ডেলিগেট কাঠামো এটিই অর্জন করে।

জাভা ইনার ক্লাস

এটি যুক্তিযুক্ত যে জাভা বেনামে অভ্যন্তর শ্রেণীর মাধ্যমে এই কার্যকারিতা সরবরাহ করে এবং সুতরাং অতিরিক্ত ডেলিগেট নির্মাণের প্রয়োজন হয় না।

obj.registerHandler(new Handler() {
        public void handleIt(Event ev) {
            methodOne(ev);
        }
      } );

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

জেনারেল হ্যান্ডলার

তবে ইভেন্ট-ভিত্তিক প্রোগ্রামিং যদি আরও বিস্তৃত পদ্ধতিতে ব্যবহার করা হয়, তবে উদাহরণস্বরূপ, সাধারণ অ্যাসিনক্রোনাস প্রোগ্রামিং পরিবেশের অংশ হিসাবে, আরও ঝুঁকির মধ্যে রয়েছে।

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

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

void processState(final T1 p1, final T2 dispatch) { 
  final int a1 = someCalculation();

  m_obj.registerHandler(new Handler() {
    public void handleIt(Event ev) {
     dispatch.methodOne(a1, ev, p1);
    }
  } );
}

ফাইনাল * ফাইনাল * ফাইনাল

আপনার মনোযোগ পেয়েছেন?

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

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


13

আমি জানি এই পোস্টটি পুরানো, তবে জাভা 8 ল্যাম্বডাস যুক্ত করেছে, এবং একটি কার্যকরী ইন্টারফেসের ধারণা, যা কোনও একটি পদ্ধতির সাথে কোনও ইন্টারফেস। একসাথে এ সি # প্রতিনিধিদের অনুরূপ কার্যকারিতা সরবরাহ করে। আরও তথ্যের জন্য, বা গুগল জাভা ল্যাম্বডাসের জন্য এখানে দেখুন। http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html


5

না, তবে তারা প্রক্সি এবং প্রতিবিম্ব ব্যবহার করে জালযোগ্য:

  public static class TestClass {
      public String knockKnock() {
          return "who's there?";
      }
  }

  private final TestClass testInstance = new TestClass();

  @Test public void
  can_delegate_a_single_method_interface_to_an_instance() throws Exception {
      Delegator<TestClass, Callable<String>> knockKnockDelegator = Delegator.ofMethod("knockKnock")
                                                                   .of(TestClass.class)
                                                                   .to(Callable.class);
      Callable<String> callable = knockKnockDelegator.delegateTo(testInstance);
      assertThat(callable.call(), is("who's there?"));
  }

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

আরও পরীক্ষা এবং প্রয়োগের জন্য গিথুবে কার্গ কোডটি দেখুন ।


2

আমি জাভাতে প্রতিবিম্ব ব্যবহার করে কলব্যাক / প্রতিনিধি সমর্থন বাস্তবায়ন করেছি। বিশদ এবং কার্যকারী উত্স আমার ওয়েবসাইটে উপলব্ধ

কিভাবে এটা কাজ করে

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

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

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

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

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

static private final Method             COUNT =Callback.getMethod(Xxx.class,"callback_count",true,File.class,File.class);

...

IoUtil.processDirectory(root,new Callback(this,COUNT),selector);

...

private void callback_count(File dir, File fil) {
    if(fil!=null) {                                                                             // file is null for processing a directory
        fileTotal++;
        if(fil.length()>fileSizeLimit) {
            throw new Abort("Failed","File size exceeds maximum of "+TextUtil.formatNumber(fileSizeLimit)+" bytes: "+fil);
            }
        }
    progress("Counting",dir,fileTotal);
    }

IoUtil.processDirectory ():

/**
 * Process a directory using callbacks.  To interrupt, the callback must throw an (unchecked) exception.
 * Subdirectories are processed only if the selector is null or selects the directories, and are done
 * after the files in any given directory.  When the callback is invoked for a directory, the file
 * argument is null;
 * <p>
 * The callback signature is:
 * <pre>    void callback(File dir, File ent);</pre>
 * <p>
 * @return          The number of files processed.
 */
static public int processDirectory(File dir, Callback cbk, FileSelector sel) {
    return _processDirectory(dir,new Callback.WithParms(cbk,2),sel);
    }

static private int _processDirectory(File dir, Callback.WithParms cbk, FileSelector sel) {
    int                                 cnt=0;

    if(!dir.isDirectory()) {
        if(sel==null || sel.accept(dir)) { cbk.invoke(dir.getParent(),dir); cnt++; }
        }
    else {
        cbk.invoke(dir,(Object[])null);

        File[] lst=(sel==null ? dir.listFiles() : dir.listFiles(sel));
        if(lst!=null) {
            for(int xa=0; xa<lst.length; xa++) {
                File ent=lst[xa];
                if(!ent.isDirectory()) {
                    cbk.invoke(dir,ent);
                    lst[xa]=null;
                    cnt++;
                    }
                }
            for(int xa=0; xa<lst.length; xa++) {
                File ent=lst[xa];
                if(ent!=null) { cnt+=_processDirectory(ent,cbk,sel); }
                }
            }
        }
    return cnt;
    }

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

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


1

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

জাভা ইন্টারফেস


1

এটিতে delegateসি # হিসাবে সুস্পষ্ট কীওয়ার্ড নেই, তবে আপনি জাভা 8 তে ক্রিয়ামূলক ইন্টারফেস (অর্থাত্ কোনও পদ্ধতিতে কোনও ইন্টারফেস) এবং ল্যাম্বডা ব্যবহার করে একইরকম অর্জন করতে পারেন:

private interface SingleFunc {
    void printMe();
}

public static void main(String[] args) {
    SingleFunc sf = () -> {
        System.out.println("Hello, I am a simple single func.");
    };
    SingleFunc sfComplex = () -> {
        System.out.println("Hello, I am a COMPLEX single func.");
    };
    delegate(sf);
    delegate(sfComplex);
}

private static void delegate(SingleFunc f) {
    f.printMe();
}

প্রকারের প্রতিটি নতুন অবজেক্ট SingleFuncঅবশ্যই প্রয়োগ করা উচিত printMe(), সুতরাং পদ্ধতিটি delegate(SingleFunc)কল করতে এটি অন্য পদ্ধতিতে (যেমন ) পাস করা নিরাপদ printMe()


0

এটি কোথাও পরিষ্কার হিসাবে কোথাও নেই তবে আপনি জাভা প্রক্সি ব্যবহার করে সি # প্রতিনিধিদের মতো কিছু বাস্তবায়ন করতে পারেন ।


2
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
স্ট্যাকফ্লোড

2
@ স্ট্যাকফ্লোয়েড স্ট্রিপ লিঙ্কটি, এবং আপনি কী পাবেন? তথ্য সহ একটি পোস্ট। রাখতে ভোট দিন।
স্কিমোনস্টার

1
@ স্কিমন্সটারে লিঙ্কটি আর বৈধ না হলে কী হবে?
স্ট্যাকফ্লোড

@ স্ট্যাকফ্লোয়েড এটি এখনও একটি উত্তর সরবরাহ করে - একটি জাভা প্রক্সি ব্যবহার করুন।
স্কিমোনস্টার

তাহলে এটিকে কি মন্তব্য হিসাবে রেখে দেওয়া যায়?
স্ট্যাকফ্লোড

0

না, তবে এটি অভ্যন্তরীণভাবে একইরকম আচরণ করে।

সি # তে প্রতিনিধিরা একটি পৃথক এন্ট্রি পয়েন্ট তৈরি করতে ব্যবহৃত হয় এবং তারা অনেকগুলি ফাংশন পয়েন্টারের মতো কাজ করে।

জাভাতে ফাংশন পয়েন্টার হিসাবে কোনও জিনিস নেই (উপরের চেহারাতে) তবে অভ্যন্তরীণভাবে জাভাকে এই উদ্দেশ্যগুলি অর্জন করার জন্য একই জিনিস করা দরকার।

উদাহরণস্বরূপ, জাভাতে থ্রেড তৈরির জন্য থ্রেড প্রসারিত বা চালানোযোগ্য প্রয়োগ করা দরকার, কারণ শ্রেণি অবজেক্ট ভেরিয়েবল একটি মেমরি অবস্থান পয়েন্টার ব্যবহার করা যেতে পারে।



0

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

  class Class1 {
        public void show(String s) { System.out.println(s); }
    }

    class Class2 {
        public void display(String s) { System.out.println(s); }
    }

    // allows static method as well
    class Class3 {
        public static void staticDisplay(String s) { System.out.println(s); }
    }

    public class TestDelegate  {
        public static final Class[] OUTPUT_ARGS = { String.class };
        public final Delegator DO_SHOW = new Delegator(OUTPUT_ARGS,Void.TYPE);

        public void main(String[] args)  {
            Delegate[] items = new Delegate[3];

            items[0] = DO_SHOW .build(new Class1(),"show,);
            items[1] = DO_SHOW.build (new Class2(),"display");
            items[2] = DO_SHOW.build(Class3.class, "staticDisplay");

            for(int i = 0; i < items.length; i++) {
                items[i].invoke("Hello World");
            }
        }
    }

-11

জাভা এর কোন প্রতিনিধি নেই এবং এতে গর্বিত :)। আমি এখানে যা পড়েছি তা থেকে আমি ভুয়া প্রতিনিধিদের কাছে 2 পন্থাগুলি খুঁজে পেয়েছি: ১. প্রতিবিম্ব; 2. অভ্যন্তর শ্রেণি

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


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