জাভাতে একটি কাস্টম ইভেন্ট তৈরি করুন


193

আমি জাভাতে এই জাতীয় কিছু করতে চাই তবে আমি উপায়টি জানি না:

যখন ইভেন্ট "অবজেক্ট 1 বলুন 'হ্যালো'" ঘটে, তখন বস্তু 2 সেই ইভেন্টটিকে "হ্যালো" বলে সাড়া দেয়।

কেউ আমাকে একটি ইঙ্গিত বা নমুনা কোড দিতে পারেন?



উত্তর:


421

আপনি সম্ভবত পর্যবেক্ষক প্যাটার্নটি দেখতে চান ।

নিজেকে শুরু করতে এখানে কিছু নমুনা কোড রয়েছে:

import java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}

সম্পর্কিত নিবন্ধ: জাভা: একটি কাস্টম ইভেন্ট তৈরি করা


স্ট্যাকওভারফ্লো.com/suggested-edits/237242 এর মধ্যে কোন বৈধ কারণ নেই ? এটি দেখায় যে 2 টি ক্লাসের সাথে এটি কীভাবে করা যায় প্রশ্নটি মূলত জিজ্ঞাসা করা হয়েছিল।
গ্লাসগোস্ট

2
যদি একাধিক থ্রেড উত্স ইভেন্টগুলি উত্পন্ন করে, তবে এটি কি সঠিকভাবে সিঙ্ক্রোনাইজ হবে?
মাইক জি

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

8
@ গ্লাসগোস্ট: এটি প্রত্যাখ্যান করা হয়েছিল কারণ এটি মূলত মোট পুনর্লিখন ছিল। অন্য কারও উত্তরে সম্পাদনাগুলি ভাল যদি তারা টাইপস এবং ফর্ম্যাটিং এবং ভাঙা লিঙ্কগুলি এবং এই জাতীয় সমাধান করে তবে তাদের সামগ্রীতে পরিবর্তন করা উচিত নয়। ("সম্প্রদায় উইকি" চিহ্নিত পোস্টগুলির জন্য কিছু ব্যতিক্রম প্রযোজ্য))
ব্যাক্তিগত সিএইচও

1
এই জন্য জাভা কোন জিনিস নির্মিত হয়? আমি সত্যিই অ্যাবস্ট্রাক্ট প্যাটার্নে এটি করতে পছন্দ করব, প্রতিটি ইভেন্টের জন্য লুপের জন্য প্রয়োগ করা হবে না।
টোমা জ্যাটো - মনিকা

27

আপনি যা চান তা বাস্তবায়ন পর্যবেক্ষক প্যাটার্নের । আপনি নিজে এটি পুরোপুরি করতে পারেন, java.util.Observerএবং জাভা ক্লাস ব্যবহার করতে পারেন এবং এর মতোjava.util.Observable


2
পুনঃব্যবহার - পুনর্ব্যবহারযোগ্য। কিন্তু কটাক্ষপাত করা stackoverflow.com/questions/2380676/...
count0

21

আপনি এটি সেট আপ করতে ইচ্ছুক হতে পারে 3 বিভিন্ন উপায় আছে:

  1. Thrower ভিতরে Catcher
  2. Catcher ভিতরে Thrower
  3. Throwerএবং Catcherএই উদাহরণে অন্য শ্রেণীর ভিতরেTest

ওয়ার্কিং গিথব উদাহরণটি আমি অপশন 3-এর ডিফল্ট হিসাবে উল্লেখ করছি, অন্যদের চেষ্টা করারOptionalজন্য আপনি যে শ্রেণীর প্রধান হতে চান তার কোড ব্লকটিকে সহজতর করতে ""চেষ্টা করুনএবং সেই শ্রেণিকে${Main-Class}ভেরিয়েবলহিসাবে সেটকরুনbuild.xml ফাইলের করুন:

পাশের কোডটি নিক্ষেপ করার জন্য 4 টি জিনিস প্রয়োজনীয়:

import java.util.*;//import of java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}

একটি ক্লাস থেকে ইভেন্টগুলি পেতে ক্লাস ফাইলে প্রয়োজনীয় জিনিস

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}

6
@ গ্লাসগোস্ট: সমস্যাটি হ'ল mainস্থির এবং thisস্ট্যাটিক ফাংশন হিসাবে এর মতো কোনও জিনিস নেই । আপনাকে new Catcher1()অন্য কোথাও তৈরি করতে হবে এবং পরিবর্তে সেই উদাহরণটি পাস করতে হবে। 1.5 thisকোনও স্থির প্রসঙ্গে অনুমতি দেয়নি ; আমি নিশ্চিত যে এটি কখনও অনুমোদিত হয় নি।
সিএওও

6
@ গ্লাসগোস্ট: যে কোডটি ব্যবহার করে thisতা কোনও কনস্ট্রাক্টারে থাকে, ইন-তে থাকে না main। এ কারণেই এটি কাজ করে। এটিকে সরান main, এবং আমি গ্যারান্টি দিচ্ছি তা হবে না। এটিই লোকেরা আপনাকে জানাতে চেষ্টা করছে এবং আপনার উত্তর কী করার চেষ্টা করছে। আমি গিথুবতে কী আছে তা আমি দিচ্ছি না - আমি কী করি তা যত্নশীল care এবং এসওতে আপনার যা আছে তা নষ্ট হয়ে গেছে।
সিএওও

7
@ গ্লাসগোস্ট: আপনার উত্তরটি সামগ্রিকভাবে অপর্যাপ্ত বলে আমি মনে করি না। আপনি ব্যবহার করার চেষ্টা করছেন - সমস্যা আমি এটা দিয়ে দেখতে যে কোড না কাজ হয় হবে thisথেকে main, যা জাভার কোনো মুক্তি সংস্করণে কম্পাইল করা হবে না। যদি সেই অংশটি পরিবর্তে কোনও কনস্ট্রাক্টরে থাকে, বা যদি এটির পরিবর্তে mainএকটি তৈরি করা হয় new Catcher1()এবং এর পরিবর্তে thisএটি ব্যবহার করা হয় তবে এটি 1.6+ তেও কাজ করা উচিত।
সিএওও

6
@ গ্লাসগোস্ট: "যে পদ্ধতিটি ঘোষিত staticহয় তাকে শ্রেণি পদ্ধতি বলা হয় A একটি শ্রেণীর পদ্ধতিটি সর্বদা নির্দিষ্ট বস্তুর রেফারেন্স ছাড়াই ডাকা হয়। মূল শব্দ thisবা কীওয়ার্ড ব্যবহার করে বর্তমান অবজেক্টের রেফারেন্স করার চেষ্টা superবা আশেপাশের যে কোনও ধরণের পরামিতিগুলি উল্লেখ করার চেষ্টা করা হয় ক্লাস পদ্ধতির শুরুর দিকে ঘোষণার ফলে একটি সংকলন-সময় ত্রুটি হয় "" - জাভা 5 এর জন্য জেএলএস, §8.4.3.2
সিএওও

31
এটি আমি দেখেছি আজব কোড স্টাইলগুলির মধ্যে একটি
এরিক

4

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

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }    
    }

ব্যবহার নিম্নরূপ:

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.