পেয়ারা ptionচ্ছিক ক্লাসের মূল বিষয় কী?


89

আমি সম্প্রতি এই সম্পর্কে পড়েছি এবং লোকেরা এই বর্গটি ব্যবহার করে দেখেছি, তবে বেশিরভাগ ক্ষেত্রেই nullব্যবহারটি পাশাপাশি কাজ করবে - যদি আরও স্বজ্ঞাততা না হয়। কেউ কি এমন কোনও দৃ concrete় উদাহরণ প্রদান করতে পারেন যেখানে Optionalএমন কিছু অর্জন করা যায় যা nullখুব পরিষ্কার পদ্ধতিতে না পারে? কেবলমাত্র আমি যা ভাবতে Mapsপারি তা হ'ল nullকীগুলি গ্রহণ না করে এটি ব্যবহার করা , তবে এটি নাল এর মানটির একটি "ম্যাপিং" দিয়েও করা যেতে পারে। কেউ কি আমাকে আরও দৃinc় বিশ্বাসের যুক্তি সরবরাহ করতে পারেন? ধন্যবাদ.


12
এলোমেলো ছদ্মবেশ: আমি এটিকে ঘৃণা করি যখন লোকেরা একটি "প্যাটার্ন" অতিরিক্ত মাত্রায় ব্যবহার করে এবং কিছু অস্তিত্বের অস্তিত্বের জন্য কোডটিকে এত কুৎসিত করে তোলে ...
RAY

জাভা 8 হিসাবে, আমি এই পেয়ারা ক্লাসটি আর ব্যবহার করব না কারণ এটি জেডিকে চেয়ে কম শক্তিশালী। স্ট্যাকওভারফ্লো.com
সেবাস্তিয়ান লরবার

উত্তর:


155

পেয়ারা দলের সদস্য এখানে।

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

তবে আমি বলব এর সর্বাধিক সুবিধাটি Optionalপড়ার যোগ্যতা নয়: সুবিধাটি হ'ল এর নির্বোধ-প্রমাণ ess আপনি যদি আপনার প্রোগ্রামটি একেবারে সংকলন করতে চান তবে এটি আপনাকে অনুপস্থিত কেস সম্পর্কে সক্রিয়ভাবে চিন্তা করতে বাধ্য করে, যেহেতু আপনাকে সক্রিয়ভাবে আন-মোড়ন করতে হবে Optionalএবং সেই মামলার সমাধান করতে হবে। নুল এটিকে ঝামেলাজনকভাবে সহজভাবে জিনিসগুলি ভুলে যাওয়া সহজ করে তোলে এবং যদিও ফাইন্ডব্যাগগুলি সহায়তা করে তবে আমি মনে করি না যে এটি সমস্যাটিকে প্রায় ভালভাবে মোকাবেলা করে। এটি বিশেষত প্রাসঙ্গিক যখন আপনি মান উপস্থিত করতে পারেন যা "উপস্থিত" থাকতে পারে না। আপনি (এবং অন্যদের) অনেক বেশী যে ভুলে করার সম্ভাবনা বেশি other.method(a, b)একটি ফিরতি পারে nullমানের চেয়ে আপনি সম্ভবত করছি যে ভুলে যেতে aহতে পারে nullযখন আপনি রূপায়ণকারী করছি other.method। ফিরছেOptional কলকারীরা তাদের কেসটি ভুলে যাওয়া অসম্ভব করে তোলে, যেহেতু তাদের নিজেরাই বস্তুটি আনপেট করতে হয়।

এই কারণগুলির জন্য, আমরা আপনাকে Optionalআপনার পদ্ধতির জন্য রিটার্ন টাইপ হিসাবে ব্যবহার করার পরামর্শ দিই , তবে অগত্যা আপনার পদ্ধতির যুক্তিগুলিতে।

(এটি পুরোপুরি আঁকড়ে ধরে রাখা হয়েছে, আলোচনা থেকে এখানে )


4
একটি দুর্দান্ত ব্যাখ্যার জন্য +1। আমি জানি না এটি অনুপ্রেরণা কিনা তবে আমি এসএমএল, ওসিএএমএল এবং এফ # এর বিকল্প ধরণের একটি পয়েন্টার যুক্ত করব, যার অনেকগুলি একই শব্দার্থক শব্দ রয়েছে।
অ্যাডাম মিহলসিন

4
যিনি সরাসরি জড়িত ছিলেন তার কাছ থেকে উত্তর পেতে সর্বদা দুর্দান্ত। আমি কেবল তার জন্যই +1 করেছি। একটি দুর্দান্ত উত্তরের জন্য আরও +1 চাই। (তবে আমি পারছি না।) আমি মনে করি যে এটি অপরিচিত পদ্ধতির গ্রাহকদেরকে "কিছুই" ফিরিয়ে দেওয়া যায় না তা স্বীকার করার চেষ্টা করার জন্য বাধ্য করা একটি রিটার্ন ভ্যালু হিসাবে থাকার বিষয়টি একটি বাধ্যতামূলক কারণ। এটি কীভাবে অতিরিক্ত ব্যবহার করা হচ্ছে (বা এমনকি অপব্যবহার করা হচ্ছে) তা আমি পছন্দ করি না। উদাহরণস্বরূপ, লোকেরা মানচিত্রে মান হিসাবে বিকল্পগুলি রাখে দেখে আমি সত্যিই অস্বস্তি বোধ করি। অ-অস্তিত্ব / ম্যাপবিহীন কীটির জন্য মানচিত্র পুনরুদ্ধার করা একটি সুপ্রতিষ্ঠিত দৃষ্টান্ত ... এটি আরও জটিল করার দরকার নেই ...
RAY

9
এটি সুপ্রতিষ্ঠিত যে কোনও কী আনম্যাপ না করা থাকলে Mapফিরে আসে null, তবে মনে রাখবেন যে যদি আপনি তা করেন map.put(key, null)তবে map.containsKey(key)ফিরে আসবে trueতবে map.get(key)ফিরে আসবে nullOptional"স্পষ্টভাবে নাল থেকে ম্যাপ করা" কেস এবং "মানচিত্রে উপস্থিত নেই" মামলার মধ্যে পার্থক্য পরিষ্কার করতে সুবিধাজনক হতে পারে। আমি মঞ্জুরি দেব যা Optionalঅপব্যবহার করা যেতে পারে, তবে আমি এখনও নিশ্চিত হতে পারি না যে আপনি বর্ণিত মামলাটি একটি অপব্যবহার।
লুই ওয়াসারম্যান

8
একটি পুরাতন উপমা ব্যবহার করার জন্য, এখানে "ফোনের বই" নামক দানবীয় জিনিস ব্যবহার করা হত :-) এবং যদি আমি আপনাকে কারও নাম্বার সন্ধান করতে বলি এবং আপনি বলেছিলেন যে "সেই ব্যক্তির কোনও নাম্বার নেই" আমি বলব "আপনি কি করবেন? এর অর্থ, তারা সেখানে তালিকাভুক্ত নম্বর নিয়ে রয়েছেন বা আপনি কেবল তাদের জন্য কোনও প্রবেশিকা খুঁজে পাচ্ছেন না? " এই দুটি সম্ভাব্য প্রতিক্রিয়া যথাক্রমে অপশনাল.অবসেন্ট () এবং নালকে ম্যাপ করে। Ptionচ্ছিক.অবসেন্ট () হল "ইতিবাচক .ণাত্মক" itive
কেভিন বোউরিলিয়ন

4
@RAY: একটি উপায়, Optional<T> হয় যে, "পাওয়া গিয়েছিলো, কিন্তু বৈধ নয়" মান। বা আরও স্পষ্টভাবে, অতিরিক্ত "পাওয়া, তবে বৈধ নয়" মান সহ যে কোনও প্রকারকে সাজানোরOptional<T> একটি উপায় - দুটি বিদ্যমান ধরণের সংমিশ্রণ করে একটি নতুন ধরণের তৈরি করা। আপনার যদি একশ শ্রেণি থাকে তবে এটি প্রতিটিটির জন্য একটি পৃথক "পাওয়া, তবে বৈধ নয়" মান তৈরি করতে অগোছালো হয়ে উঠতে পারে, তবে সহজেই তাদের সকলের জন্য কাজ করতে পারে। TOptional<T>
ড্যানিয়েল প্রাইডেন

9

এটি Maybeহ্যাশেল থেকে মোনাড প্যাটার্নের মতো দেখাচ্ছে ।

আপনার নিম্নলিখিত, উইকিপিডিয়া মনাদ (ক্রিয়ামূলক প্রোগ্রামিং) পড়া উচিত :

এবং কের্ফ্লিনের ব্লগে avaচ্ছিক থেকে মনাদ পর্যন্ত পেয়ারা পড়ুন , যা মোনাড হিসাবে ব্যবহৃত পেয়ারার ptionচ্ছিক সম্পর্কে আলোচনা করেছে:


সম্পাদনা: জাভা 8 এর সাথে একটি বিল্ট-ইন ptionচ্ছিকাল রয়েছে যা মোনাদিক অপারেটরদের পছন্দ করে flatMap। এটি একটি বিতর্কিত বিষয় হলেও অবশেষে এটি কার্যকর করা হয়েছে।

Http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html দেখুন

public Optional<String> tryFindSimilar(String s)  //...

Optional<Optional<String>> bad = opt.map(this::tryFindSimilar);
Optional<String> similar =       opt.flatMap(this::tryFindSimilar);

flatMapঅপারেটর সহজে শৃঙ্খল কল যে সব আগমন ঐচ্ছিক ফলাফলে পরমাণুসদৃশ্য অপারেশন, এবং পারমিট করার অনুমতি অপরিহার্য।

সেটা ভাবুন, আপনি যদি ব্যবহৃত mapঅপারেটর 5 বার আপনি একটি দিয়ে শেষ হবে Optional<Optional<Optional<Optional<Optional<String>>>>>, যখন ব্যবহার flatMapআপনাকে দিতে হবেOptional<String>

জাভা 8 এর পরে আমি পেয়ারা Oচ্ছিক যা কম শক্তিশালী তা ব্যবহার করব না।


6

এটির ব্যবহারের একটি ভাল কারণ হ'ল এটি আপনার নালগুলিকে খুব অর্থবহ করে তোলে। নাল ফিরিয়ে দেওয়ার পরিবর্তে অনেক কিছুই বোঝাতে পারে (যেমন ত্রুটি, বা ব্যর্থতা, বা খালি ইত্যাদি) আপনি আপনার নালায় একটি 'নাম' রাখতে পারেন। এই উদাহরণটি দেখুন:

একটি বেসিক POJO সংজ্ঞায়িত করা যাক:

class PersonDetails {

String person;
String comments;

public PersonDetails(String person, String comments) {
    this.person = person;
    this.comments = comments;
}

public String getPerson() {
    return person;
}


public String getComments() {
    return comments;
}

}

এখন এই সহজ পোজো ব্যবহার করতে দিন:

public Optional<PersonDetails> getPersonDetailstWithOptional () {

  PersonDetails details = null; /*details of the person are empty but to the caller this is meaningless,
  lets make the return value more meaningful*/


    if (details == null) {
      //return an absent here, caller can check for absent to signify details are not present
        return Optional.absent();
    } else {
      //else return the details wrapped in a guava 'optional'
        return Optional.of(details);   
    }
}

এখন নাল ব্যবহার এড়াতে দিন এবং cheচ্ছিকর সাথে আমাদের চেকগুলি এর অর্থবহ তাই করতে দিন

public void checkUsingOptional () {

    Optional<PersonDetails> details = getPersonDetailstWithOptional();

    /*below condition checks if persons details are present (notice we dont check if person details are null,
    we use something more meaningful. Guava optional forces this with the implementation)*/
    if (details.isPresent()) {

      PersonDetails details = details.get();

        // proceed with further processing
        logger.info(details);

    } else {
        // do nothing
        logger.info("object was null"); 
    }

    assertFalse(details.isPresent());
}

এভাবে শেষ পর্যন্ত নালগুলি অর্থবহ এবং কম অস্পষ্ট করার উপায়।


4

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

যদি আপনি কনভেনশনটি সর্বদা Optionalসম্ভব নাল বস্তুর জন্য রাখেন তবে আপনি যেমন ক্ষেত্রে আরও স্পষ্টতা যুক্ত করতে পারেন:

  1. Optional<Integer> maxPrime(Optional<Integer> from, Optional<Integer> to)

    এখানে চুক্তিটি স্পষ্টভাবে উল্লেখ করে যে কোনও ফলাফল না ফেরার সম্ভাবনা রয়েছে তবে এটি প্রদর্শিত fromএবং toএটি অনুপস্থিত হিসাবে কাজ করবে shows

  2. Optional<Integer> maxPrime(Optional<Integer> from, Integer to)

    চুক্তি নির্দিষ্ট করে ঐচ্ছিক তাই একটি থেকে অনুপস্থিত মান শুরু 2. থেকে আমি আশা করতে পারেন যে জন্য একটি নাল মান মত একটি বিশেষ অর্থ থাকতে পারে toপরামিতি একটি ব্যতিক্রম নিক্ষেপ করা হবে।

সুতরাং ptionচ্ছিক ব্যবহারের ভাল অংশটি হ'ল চুক্তিটি উভয় বর্ণনামূলক হয়ে উঠেছে ( @NotNullটীকাগুলির সাথে অনুরূপ ) তবে এটিও আনুষ্ঠানিক, যেহেতু আপনাকে .get()মোকাবেলার জন্য কোড অবশ্যই লিখতে হবে Optional


কেন একটি ptionচ্ছিক <তালিকাগুলি ব্যবহার করবেন যখন খালি তালিকাটি ক্লিনার হবে?
রে

আমি প্রত্যাবর্তনের সময় ভুল উদাহরণটি বেছে নিয়েছি। সংগ্রহগুলির সাহায্যে আপনি কনভেনশনটি সর্বদা শূন্য সংগ্রহের পরিবর্তে নাল মানটি ফিরিয়ে আনতে পারেন। যদি এই সম্মেলনটি ব্যবহৃত হয় তবে সংগ্রহের জন্য আপনার youচ্ছিক প্রয়োজন হবে না। Zeroচ্ছিকটি শূন্য বা একটি উপাদান সহ একটি সংগ্রহ হিসাবে ধরা যেতে পারে তাই এটি অন্য সংগ্রহের চারপাশে রাখার প্রয়োজন হয় না।
কিসমেকোস্টিন

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