Optional.of অপশনাল.ওফুলের উপর কেন ব্যবহার করবেন?


232

জাভা 8 Optionalক্লাসটি ব্যবহার করার সময় , দুটি উপায় রয়েছে যেখানে কোনও মান একটি alচ্ছিকভাবে মোড়ানো যায়।

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

আমি বুঝি Optional.ofNullableব্যবহারের একমাত্র নিরাপদ উপায় Optional, তবে কেন Optional.ofআদৌ বিদ্যমান? কেন কেবল Optional.ofNullable সর্বদা ব্যবহার এবং নিরাপদ পাশে থাকা নয়?


1
দয়া করে বলুন কোন প্যাকেজটি এটি ব্যবহার করতে হবে?
লাভটোকোড

4
@ লাভটোকোড java.util.Optional- আপনি জেডিকে ৮ বা তার বেশি ব্যবহার করছেন যদি এটি পাওয়া যায়
ঘূর্ণি

11
আমি ভালোবেসে ছিলাম যদি তারা যেত ofNullable()নামে of()এবং of()নামেofNotNull()
রবার্ট Niestroj


আপনি যেমন জিজ্ঞাসা করছেন "Oচ্ছিক.এফটি কেন বিদ্যমান? কেন কেবল অপশনাল.ওফুল ব্যবহার করবেন না এবং সর্বদা নিরাপদ পাশে থাকবেন না?" আসুন বলি যে ব্যবহারকারীর প্রয়োজনীয় ডেটা উপস্থিত না থাকলে আমাদের অবশ্যই ব্যতিক্রম ছুঁড়ে ফেলা উচিত। সুতরাং, এটি সম্পূর্ণরূপে আপনার ব্যবহারের উপর নির্ভর করে। baeldung.com/java-optional-throw-exception
করণ অরোরা

উত্তর:


306

আপনার প্রশ্ন অনুমানের উপর ভিত্তি করে তৈরি করা হয় যে কোডটি ফেলে NullPointerExceptionদিতে পারে তা কোডের চেয়েও খারাপ which এই অনুমানটি ভুল। আপনি যদি মনে করেন যে foobarপ্রোগ্রাম লজিকের কারণে আপনার কখনই বাতিল হয় না, তবে এটি ব্যবহার করা আরও ভাল Optional.of(foobar)কারণ আপনি এটি দেখতে পাবেন NullPointerExceptionযা আপনার প্রোগ্রামটিতে একটি বাগ আছে। যদি আপনি ব্যবহার করেন Optional.ofNullable(foobar)এবং ত্রুটির কারণে foobarঘটে থাকে nullতবে আপনার প্রোগ্রামটি নিঃশব্দে ভুলভাবে কাজ চালিয়ে যাবে, যা হতে পারে আরও বড় বিপর্যয়। এইভাবে একটি ত্রুটি অনেক পরে দেখা দিতে পারে এবং এটি বুঝতে ভুল হবে যে কোন সময়ে এটি ভুল হয়েছে।


129
" আপনি যদি আশা করেন যে প্রোগ্রামটির যুক্তির কারণে আপনার ফুবার কখনই শূন্য হয় না তবে এটি ব্যবহার করা আরও ভালOptional.of(foobar) । এটিকে কিছুটা অদ্ভুত বলে মনে হচ্ছে - যখন আমরা জানি যে মানটি nullকোনও ক্ষেত্রেই হবে না , তবে কেন মানটিকে কোনওটির মধ্যে মুড়িয়ে না রেখে নিজেই ব্যবহার করবেন না Optional?
কনস্ট্যান্টিন ইয়োভকভ

54
@ কোকো, আপনি Optionalপ্রয়োগ করছেন এমন ইন্টারফেসের দ্বারা প্রয়োজনীয় পদ্ধতিটি আপনাকে ফিরিয়ে দিতে হতে পারে (সম্ভবত অন্যান্য বাস্তবায়নকারীরা খালি returnচ্ছিকভাবে ফিরে আসতে পারে)। অথবা আপনি বিকল্পগুলির একটি সংগ্রহ / স্ট্রিম তৈরি করতে চান, এর কয়েকটি গ্যারান্টিযুক্ত নন-নাল এবং কিছু নয়। অথবা আপনার শর্তাধীন যুক্তি রয়েছে যা বেশ কয়েকটি শাখায় এবং একক শাখায় একটি alচ্ছিক তৈরি করে আপনি নিশ্চিত যে এটি অকার্যকর।
তাগীর ভালিভ

28
কারণ alচ্ছিক অর্থ এটি উপস্থিত হতে পারে বা অনুপস্থিত sent অনুপস্থিত! = নাল nullএই ক্ষেত্রে "আমি ফুবারের উপস্থিতি প্রত্যাশা করি তবে বাগের কারণে এটি বাতিল হয়"। Optional.isPresent() == falseমানে ফুবার উপস্থিত নেই, অর্থাত্ এটি প্রত্যাশিত, বৈধ আচরণ।
বুড়ম্যান

43
@kocko: সহজ উদাহরণ: কখনও ধারণ বলে আশা করা হচ্ছে ... মানreturn list.isEmpty()? Optional.empty(): Optional.of(list.get(0));listnull
হোলগার

5
@ হরিশ যদি আপনি আমাকে জিজ্ঞাসা করেন তবে আমি সর্বত্র বিকল্পগুলি ব্যবহার করার পরামর্শ দিচ্ছি না। এটি একটি পৃথক প্রশ্ন। আপনি এখানে কিছু মতামত পরীক্ষা করতে পারেন ।
তাগীর বলিভ

12

তদতিরিক্ত, যদি আপনি জানেন যে আপনার কোডটি কাজ করা উচিত নয় যদি অবজেক্টটি নাল হয় তবে আপনি ব্যবহার করে ব্যতিক্রম ছুঁড়ে ফেলতে পারেন Optional.orElseThrow

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

1
তবে এর জন্য, আপনি এমনকি আরও String name = Objects.requireNonNull(nullName);
হলগার

1
ভাল পয়েন্ট @ হোলজার, তবে .অলিজ () পদ্ধতিটি কাস্টম ব্যতিক্রমগুলিকে অনুমতি দেয় যা আপনাকে নিয়ন্ত্রণ বা তথ্য লগিংয়ের প্রবাহকে আরও ভালভাবে পরিচালনা করতে সহায়তা করে।
নিকোস স্টাইস

1
ঠিক আছে, অতিরিক্ত তথ্য দেওয়ার জন্য আপনি ব্যতিক্রমের জন্য একটি বার্তা সরবরাহ করতে পারেন। কাস্টমাইজেশনের অন্য কোনও প্রয়াস NullPointerExceptionযেমন সমস্যার স্পষ্টতই একটি রেফারেন্সের চেয়ে আলাদা ব্যতিক্রম ব্যবহার করা nullঅন্যদিকে যেমন ভুল দিকের দিকে পদক্ষেপ হয়।
হোলার

এছাড়াও, আপনি আরও নির্দিষ্ট (উদাহরণস্বরূপ কাস্টম) নিক্ষেপ করতে new NullNameException("meaningful msg")
ptionচ্ছিক

1

এটি পরিস্থিতিগুলির উপর নির্ভর করে।

ধরা যাক আপনার কিছু ব্যবসায়ের কার্যকারিতা রয়েছে এবং আপনার সেই মানটি নিয়ে আরও কিছু প্রক্রিয়া করা প্রয়োজন তবে nullপ্রক্রিয়াজাতকরণের সময় মূল্য থাকা এর প্রভাব ফেলবে।

তারপরে, সেই ক্ষেত্রে, আপনি ব্যবহার করতে পারেন Optional<?>

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");

0

Mainlyচ্ছিকভাবে মূলত যাইহোক পরিষেবাগুলির ফলাফলের জন্য ব্যবহার করা উচিত। পরিষেবাটিতে আপনি কী জানেন যে আপনার হাতে কী আছে এবং যদি আপনার ফলাফল থাকে তবে ptionচ্ছিক.ফ (কিছু ভ্যালু) ফিরে করুন এবং যদি আপনি না পান তবে ptionচ্ছিক.ইম্পটি () ফিরিয়ে দিন। এই ক্ষেত্রে, কিছু মান কখনই নਾਲ এবং এখনও হওয়া উচিত নয়, আপনি একটি ptionচ্ছিক ফিরে আসেন।


1
সুমেশ সম্পাদনা করার জন্য ধন্যবাদ, তবে শেষ পংক্তির "কিছুটা মূল্য" যা আপনি "কিছু মান" হিসাবে সম্পাদনা করেছেন, উপরে "Oচ্ছিক.ওফ (কিছুটা মূল্য)" তে পরিবর্তনশীল উল্লেখ করে এবং কিছুটা মূল্য থাকা উচিত, আমি মনে করি।
এসপেনডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.