উত্তর:
কেন এমন? এর অর্থ কি এই যে আমাদের আর পর্যবেক্ষক প্যাটার্ন প্রয়োগ করা উচিত নয়?
প্রথমের উত্তরটির উত্তর দেওয়া -
হ্যাঁ , এর অর্থ হ'ল আপনার বাস্তবায়ন করা উচিত নয়ObserverএবংObervable আর s।
কেন তাদের অবমূল্যায়ন করা হয়েছিল -
তারা অ্যাপ্লিকেশনগুলির জন্য যথেষ্ট পরিমাণে ইভেন্টের মডেল সরবরাহ করে নি। উদাহরণস্বরূপ, তারা কেবলমাত্র কিছু পরিবর্তিত হয়েছে এই ধারণাকে সমর্থন করতে পারে, তবে কী পরিবর্তন হয়েছে সে সম্পর্কে কোনও তথ্য দেয়নি।
অ্যালেক্সের উত্তর এটিকে সুন্দরভাবে সামনে রেখেছিল যার Observerদুর্বলতা রয়েছে: সমস্ত Observableগুলি একই রকম । আপনার উপর ভিত্তি করে যুক্তিটি প্রয়োগ করতে হবে instanceofএবং কংক্রিটের ধরণের অবজেক্টটিতে কাস্ট করতে পারেনObservable.update() পদ্ধতিতে পদ্ধতিতে
এটি যুক্ত করার জন্য কোনও বাগ যেমন শ্রেণিটি ক্রমিকায়িতObservable করতে পারেনি কারণ এটি কার্যকর হয়নিSerializable ইন্টারফেস এবং এর সমস্ত সদস্যই ব্যক্তিগত ছিল।
এর চেয়ে ভাল বিকল্প কী?
অন্যদিকে Listenersঅনেক ধরণের রয়েছে এবং তাদের কলব্যাক পদ্ধতি রয়েছে এবং কাস্টিংয়ের প্রয়োজন হয় না। @ রবি তার উত্তরে যেমন উল্লেখ করেছেন আপনি এটি ব্যবহার করতে পারেন PropertyChangeListener পরিবর্তে ।
এটির বাকিগুলির জন্য @Deprecationঅন্যান্য প্যাকেজগুলি অনুলিপি করার জন্য যথাযথ ডকুমেন্টেশন সহ চিহ্নিত করা হয়েছে যা অন্যান্য উত্তরের সাথে যুক্ত রয়েছে।
মনে রাখবেন যে, থামিয়ে দেওয়া নামেও বিবৃত একটি বিশ্লেষণ দিয়ে চিহ্নিত করা হয়েছিল এই মেলটি -
এই দিনগুলিতে, যে কেউ এগুলির মুখোমুখি হচ্ছে সম্ভবত সম্ভবত ভুল দ্বারা তাদের আঘাত করছে
RxJavaবা অন্যান্য প্রতিক্রিয়াশীল-স্ট্রিম ফ্রেমওয়ার্ক ব্যবহার করার সময় । সেক্ষেত্রে ব্যবহারকারীরা সাধারণত jdk9java.util.concurrent.FlowAPI ব্যবহার করতে চাইবেন যে সমস্ত প্রতিক্রিয়াশীল-স্ট্রিম ফ্রেমওয়ার্কগুলি তাদের পরিকল্পিত আসন্ন jdk9- সামঞ্জস্যপূর্ণ সংস্করণগুলির মধ্যে সামঞ্জস্যপূর্ণ / আন্তঃক্রিয়াযুক্ত হতে হবে।
সম্পাদনা : এটিও উল্লেখ করার মতো যে, এপিআইগুলির অবমূল্যায়ন মূলত কেবল উপরের কারণেই নয়, তবে ত্রুটিযুক্ত প্রতিবেদন (উপরে লিঙ্ক করা) কয়েকটিতে মন্তব্য হিসাবে উল্লিখিত লিগ্যাসি কোড বজায় রাখতে অক্ষম হয়ে পড়েছিল যা উত্থাপিত হয়েছিল এক বা অন্য উপায়ে এর বাস্তবায়নের উন্নতি চিহ্নিত করুন।
Listenerএছাড়াও একটি পর্যবেক্ষক।
notifyObservers()একইসাথে। বিশদে এর কার্যকারিতাটি বর্ণনা করার জন্য এখানে ভাগ করে নেওয়া একই থেকে একটি কোডলেট রয়েছে ।
হ্যাঁ, এটি জাভা 9-এ অবচয় করা হয়েছে । এবং, আমরা আর পর্যবেক্ষক প্যাটার্ন প্রয়োগ করতে পারি না।
আরও কারণ রয়েছে:
সিরিয়ালাইজযোগ্য নয় - যেহেতু, পর্যবেক্ষণযোগ্য সিরিয়ালাইজেবল প্রয়োগ করে না। সুতরাং, আপনি পর্যবেক্ষণযোগ্য না এর উপক্লাসকে সিরিয়ালাইজ করতে পারবেন না।
কোনও থ্রেড নিরাপত্তা নেই - পদ্ধতিগুলি তার উপশ্রেণীর দ্বারা ওভাররাইড করা যেতে পারে এবং ইভেন্ট বিজ্ঞপ্তি বিভিন্ন ক্রমে এবং সম্ভবত বিভিন্ন থ্রেডে ঘটতে পারে যা কোনও "থ্রেড সুরক্ষা" ব্যাহত করার জন্য যথেষ্ট।
কম অফার -
তারা অ্যাপ্লিকেশনগুলির জন্য যথেষ্ট পরিমাণে ইভেন্টের মডেল সরবরাহ করে না। উদাহরণস্বরূপ, তারা কেবলমাত্র কিছু পরিবর্তিত হয়েছে এই ধারণাকে সমর্থন করে তবে তারা কী পরিবর্তন হয়েছে সে সম্পর্কে কোনও তথ্যই জানায় না
উন্মুক্ত ইস্যু - যেমন উল্লিখিত রয়েছে, সেখানে অনেকগুলি বড় সমস্যা উত্থাপিত হয়েছিল (থ্রেড সুরক্ষা, সিরিয়ালাইজেবল) এবং তাদের বেশিরভাগের ঠিক করার জন্য জটিলতা ছিল এবং এখনও "স্থির নয়" বা কোনও সক্রিয় উন্নয়ন নেই , এবং এ কারণেই এটি অবহেলা করা হয়েছে ।
আমি এই উত্তরটি পড়ার জন্য সুপারিশও করব কেন পর্যবেক্ষক ধরণটি হ্রাস করা উচিত? , @ জেফ অবমূল্যায়নের অন্যান্য কারণ ব্যাখ্যা করেছেন।
আপনি PropertyChangeEventএবং প্যাকেজ PropertyChangeListenerথেকে ব্যবহার করতে পারেন java.beans।
PropertyChangeListenerপ্রতিস্থাপন করে Observerতবে এর পরিবর্তে আমার কী প্রসারিত / বাস্তবায়ন করা উচিত Observable?
PropertyChangeSupportএকটি উদাহরণ ভেরিয়েবল হিসাবে যুক্ত করা হবে তবে আমি একটি নিশ্চিতকরণের প্রশংসা করব।
কেন জাভা 9 এ পর্যবেক্ষক অবহেলিত?
উত্তর:Observable শ্রেণী এবং Observerইন্টারফেস জাভা 9 অবচিত হয়েছে কারণ দ্বারা সমর্থিত ঘটনা মডেল Observerএবং Observableবেশ সীমিত, বিজ্ঞপ্তিগুলি ক্রম দ্বারা বিতরণObservable অনির্দিষ্ট, এবং রাষ্ট্র পরিবর্তন এক-জন্য-এক বিজ্ঞপ্তি দিয়ে চিঠিপত্রের অংশ নয়।
জাভা ডক https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html দেখুন
পর্যবেক্ষক প্যাটার্নের বিকল্প?
পর্যবেক্ষক ডিজাইন প্যাটার্নের অনেকগুলি বিকল্প রয়েছে এবং প্রতিক্রিয়াশীল স্ট্রিমগুলির মধ্যে একটি।
প্রতিক্রিয়াশীল স্ট্রিম বা ফ্লো এপিআই :
Flowএকটি বর্গ জাভা 9 চালু এবং 4 পারস্পরিক সম্পর্কযুক্ত ইন্টারফেসগুলি রয়েছে: Processor, Publisher, SubscriberএবংSubscription ।
Flow.Processor : এমন একটি উপাদান যা গ্রাহক এবং প্রকাশক উভয়ই হিসাবে কাজ করে।
Flow.Publisher : সাবস্ক্রাইবারদের দ্বারা প্রাপ্ত আইটেমগুলির একজন প্রযোজক।
Flow.Subscriber : বার্তা গ্রহণকারী of
Flow.Subscription: বার্তা নিয়ন্ত্রণ একটি Flow.Publisherএবং লিঙ্ক Flow.Subscriber।
জাভা ডকটি https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html দেখুন
Observableশ্রেণি এবং Observerইন্টারফেসটি জাভা 9 হিসাবে অবচিত করা হয়েছে তা বিবেচনা করে জাভা'র পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য জেডিকে 9-তে অবমূল্যায়ন করা হয়েছে
পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য দ্বারা সমর্থিত ইভেন্টের মডেলটি বেশ সীমাবদ্ধ, পর্যবেক্ষণযোগ্য দ্বারা সরবরাহ করা বিজ্ঞপ্তির ক্রমটি অনির্দিষ্ট and আরও সমৃদ্ধ ইভেন্টের মডেলের জন্য,
java.beansপ্যাকেজটি ব্যবহার করার বিষয়টি বিবেচনা করুন । থ্রেডগুলির মধ্যে নির্ভরযোগ্য এবং অর্ডারযুক্ত বার্তাপ্রেরণের জন্য,java.util.concurrentপ্যাকেজে থাকা সমসাময়িক ডেটা স্ট্রাকচারগুলির মধ্যে একটি ব্যবহার বিবেচনা করুন । প্রতিক্রিয়াশীল স্ট্রিম স্টাইল প্রোগ্রামিংয়ের জন্য, ফ্লো এপিআই দেখুন।