জাভা 9 এ পর্যবেক্ষক অবহেলিত হয়েছে এর পরিবর্তে আমাদের কী ব্যবহার করা উচিত?


133

জাভা 9 বেরিয়ে এসেছিল এবং Observerতাকে অবহেলা করা হয়েছে। তা কেন? এর অর্থ কি এই যে আমাদের আর পর্যবেক্ষক প্যাটার্ন প্রয়োগ করা উচিত নয়?

আরও ভাল বিকল্প কি তা জানা ভাল হবে?

উত্তর:


104

কেন এমন? এর অর্থ কি এই যে আমাদের আর পর্যবেক্ষক প্যাটার্ন প্রয়োগ করা উচিত নয়?

প্রথমের উত্তরটির উত্তর দেওয়া -

হ্যাঁ , এর অর্থ হ'ল আপনার বাস্তবায়ন করা উচিত নয়ObserverএবংObervable আর s।

কেন তাদের অবমূল্যায়ন করা হয়েছিল -

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

অ্যালেক্সের উত্তর এটিকে সুন্দরভাবে সামনে রেখেছিল যার Observerদুর্বলতা রয়েছে: সমস্ত Observableগুলি একই রকম । আপনার উপর ভিত্তি করে যুক্তিটি প্রয়োগ করতে হবে instanceofএবং কংক্রিটের ধরণের অবজেক্টটিতে কাস্ট করতে পারেনObservable.update() পদ্ধতিতে পদ্ধতিতে

এটি যুক্ত করার জন্য কোনও বাগ যেমন শ্রেণিটি ক্রমিকায়িতObservable করতে পারেনি কারণ এটি কার্যকর হয়নিSerializable ইন্টারফেস এবং এর সমস্ত সদস্যই ব্যক্তিগত ছিল।

এর চেয়ে ভাল বিকল্প কী?

অন্যদিকে Listenersঅনেক ধরণের রয়েছে এবং তাদের কলব্যাক পদ্ধতি রয়েছে এবং কাস্টিংয়ের প্রয়োজন হয় না। @ রবি তার উত্তরে যেমন উল্লেখ করেছেন আপনি এটি ব্যবহার করতে পারেন PropertyChangeListener পরিবর্তে ।

এটির বাকিগুলির জন্য @Deprecationঅন্যান্য প্যাকেজগুলি অনুলিপি করার জন্য যথাযথ ডকুমেন্টেশন সহ চিহ্নিত করা হয়েছে যা অন্যান্য উত্তরের সাথে যুক্ত রয়েছে।


মনে রাখবেন যে, থামিয়ে দেওয়া নামেও বিবৃত একটি বিশ্লেষণ দিয়ে চিহ্নিত করা হয়েছিল এই মেলটি -

এই দিনগুলিতে, যে কেউ এগুলির মুখোমুখি হচ্ছে সম্ভবত সম্ভবত ভুল দ্বারা তাদের আঘাত করছে RxJavaবা অন্যান্য প্রতিক্রিয়াশীল-স্ট্রিম ফ্রেমওয়ার্ক ব্যবহার করার সময় । সেক্ষেত্রে ব্যবহারকারীরা সাধারণত jdk9 java.util.concurrent.FlowAPI ব্যবহার করতে চাইবেন যে সমস্ত প্রতিক্রিয়াশীল-স্ট্রিম ফ্রেমওয়ার্কগুলি তাদের পরিকল্পিত আসন্ন jdk9- সামঞ্জস্যপূর্ণ সংস্করণগুলির মধ্যে সামঞ্জস্যপূর্ণ / আন্তঃক্রিয়াযুক্ত হতে হবে।

সম্পাদনা : এটিও উল্লেখ করার মতো যে, এপিআইগুলির অবমূল্যায়ন মূলত কেবল উপরের কারণেই নয়, তবে ত্রুটিযুক্ত প্রতিবেদন (উপরে লিঙ্ক করা) কয়েকটিতে মন্তব্য হিসাবে উল্লিখিত লিগ্যাসি কোড বজায় রাখতে অক্ষম হয়ে পড়েছিল যা উত্থাপিত হয়েছিল এক বা অন্য উপায়ে এর বাস্তবায়নের উন্নতি চিহ্নিত করুন।


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

25
একটি নির্দিষ্ট বাস্তবায়ন অবমূল্যায়িত হওয়ার অর্থ এই নয় যে পর্যবেক্ষক প্যাটার্ন মারাত্মকভাবে ত্রুটিযুক্ত। Listenerএছাড়াও একটি পর্যবেক্ষক।
ক্রাইলিস -কোটিরিওপটিস্টিস্টিক-

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

@ উত্সাহী 95 সেখানে সমকালীন অবহিত করার উপায় বুঝতে সক্ষম নন ।
নামান

4
@ কৌতূহল 95 হ্যাঁ আহ্বান notifyObservers()একইসাথে। বিশদে এর কার্যকারিতাটি বর্ণনা করার জন্য এখানে ভাগ করে নেওয়া একই থেকে একটি কোডলেট রয়েছে
নামান

37

হ্যাঁ, এটি জাভা 9-এ অবচয় করা হয়েছে । এবং, আমরা আর পর্যবেক্ষক প্যাটার্ন প্রয়োগ করতে পারি না।


কেন এমন?

আরও কারণ রয়েছে:

সিরিয়ালাইজযোগ্য নয় - যেহেতু, পর্যবেক্ষণযোগ্য সিরিয়ালাইজেবল প্রয়োগ করে না। সুতরাং, আপনি পর্যবেক্ষণযোগ্য না এর উপক্লাসকে সিরিয়ালাইজ করতে পারবেন না।

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

কম অফার -

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

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

আমি এই উত্তরটি পড়ার জন্য সুপারিশও করব কেন পর্যবেক্ষক ধরণটি হ্রাস করা উচিত? , @ জেফ অবমূল্যায়নের অন্যান্য কারণ ব্যাখ্যা করেছেন।


সুতরাং, আমাদের বিকল্প কি?

আপনি PropertyChangeEventএবং প্যাকেজ PropertyChangeListenerথেকে ব্যবহার করতে পারেন java.beans


PropertyChangeListenerপ্রতিস্থাপন করে Observerতবে এর পরিবর্তে আমার কী প্রসারিত / বাস্তবায়ন করা উচিত Observable?
লাস্টস্টার 7007

আপডেট: আমি মনে করি পন্থাটি PropertyChangeSupportএকটি উদাহরণ ভেরিয়েবল হিসাবে যুক্ত করা হবে তবে আমি একটি নিশ্চিতকরণের প্রশংসা করব।
সর্বশেষতম 700

3
@ লাস্টস্টার 7007 আমি মনে করি আপনি ঠিক বলেছেন। আমি Baeldung.com এ একটি কোড নমুনা পেয়েছি যা কেবল এটি করে।
ড্রাগগস স্ট্যানসিউ

13

কেন জাভা 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 দেখুন


7

Observableশ্রেণি এবং Observerইন্টারফেসটি জাভা 9 হিসাবে অবচিত করা হয়েছে তা বিবেচনা করে জাভা'র পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য জেডিকে 9-তে অবমূল্যায়ন করা হয়েছে

পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য দ্বারা সমর্থিত ইভেন্টের মডেলটি বেশ সীমাবদ্ধ, পর্যবেক্ষণযোগ্য দ্বারা সরবরাহ করা বিজ্ঞপ্তির ক্রমটি অনির্দিষ্ট and আরও সমৃদ্ধ ইভেন্টের মডেলের জন্য, java.beans প্যাকেজটি ব্যবহার করার বিষয়টি বিবেচনা করুন । থ্রেডগুলির মধ্যে নির্ভরযোগ্য এবং অর্ডারযুক্ত বার্তাপ্রেরণের জন্য, java.util.concurrentপ্যাকেজে থাকা সমসাময়িক ডেটা স্ট্রাকচারগুলির মধ্যে একটি ব্যবহার বিবেচনা করুন । প্রতিক্রিয়াশীল স্ট্রিম স্টাইল প্রোগ্রামিংয়ের জন্য, ফ্লো এপিআই দেখুন।

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