JavaRush /جاوا بلاگ /Random-UR /کافی وقفہ نمبر 161۔ اختیاری کا استعمال کرتے ہوئے جاوا میں...

کافی وقفہ نمبر 161۔ اختیاری کا استعمال کرتے ہوئے جاوا میں Null کو کیسے ہینڈل کریں۔

گروپ میں شائع ہوا۔
ماخذ: میڈیم یہ مضمون جاوا کوڈ کے ساتھ کام کرتے وقت اختیاری کے مقصد کو بہتر طور پر سمجھنے میں آپ کی مدد کرے گا۔ کافی وقفہ نمبر 161۔  اختیاری - 1 کا استعمال کرتے ہوئے جاوا میں Null کو کیسے ہینڈل کریں۔جب میں نے پہلی بار جاوا کوڈ کے ساتھ کام کرنا شروع کیا تو مجھے اکثر اختیاری استعمال کرنے کا مشورہ دیا گیا۔ لیکن اس وقت مجھے اس بات کی بہت کم سمجھ تھی کہ کیوں اختیاری کا استعمال کالعدم اقدار کے لئے ہینڈلنگ کو نافذ کرنے سے بہتر ہے۔ اس مضمون میں، میں آپ کے ساتھ اشتراک کرنا چاہتا ہوں کہ مجھے کیوں لگتا ہے کہ ہم سب کو اختیاری کو زیادہ استعمال کرنا چاہیے، اور اپنے کوڈ کو زیادہ اختیار کرنے سے کیسے بچیں، جو کوڈ کے معیار کے لیے نقصان دہ ہے۔

اختیاری کیا ہے؟

اختیاری پیرامیٹر اشیاء کو لے جانے کے لیے استعمال کیا جاتا ہے اور مختلف APIs کے ذریعے null حوالہ جات کو قابل بناتا ہے۔ آئیے کوڈ کا ٹکڑا دیکھتے ہیں:
Coffee coffee = new Coffee();
Integer quantity = coffee.getSugar().getQuantity();
ہمارے پاس کافی کی مثال ہے جس میں ہمیں شوگر آبجیکٹ کی مثال سے کچھ مقدار میں چینی ملتی ہے ۔ اگر ہم فرض کریں کہ مقدار کی قدر کبھی بھی کافی کنسٹرکٹر میں سیٹ نہیں کی گئی تھی ، تو coffee.getSugar().getQuantity() NullPointerException واپس کرے گا ۔ بلاشبہ، ہم مسئلہ کو حل کرنے کے لیے ہمیشہ اچھے پرانے null چیک استعمال کر سکتے ہیں۔
Coffee coffee = new Coffee();
Integer quantity = 0;
if (coffee.getSugar() != null) {
  quantity = coffee.getSugar().getQuantity();
}
اب لگتا ہے سب کچھ ٹھیک ہے۔ لیکن جاوا کوڈ لکھتے وقت، ہم بہتر طور پر null checks کو لاگو کرنے سے گریز کریں گے ۔ آئیے دیکھتے ہیں کہ یہ اختیاری کا استعمال کرتے ہوئے کیسے کیا جا سکتا ہے۔

اختیاری بنانے کا طریقہ

اختیاری اشیاء بنانے کے تین طریقے ہیں:
  • of(T ویلیو) — ایک اختیاری غیر null آبجیکٹ کا آغاز۔ آگاہ رہیں کہ null آبجیکٹ کا حوالہ دینے کے لیے of() کا استعمال NullPointerException کو پھینک دے گا ۔

  • ofNullable(T ویلیو) - کسی شے کے لیے ایک اختیاری قدر تخلیق کرتا ہے جو کہ کالعدم ہو سکتی ہے۔

  • empty() - ایک اختیاری مثال بناتا ہے جو null کے حوالہ کی نمائندگی کرتا ہے ۔

// пример использования Optional.of(T Value)
String name = "foo";
Optional<String> stringExample = Optional.of(name)
// пример использования Optional.ofNullable(T Value)
Integer age = null;
Optional<Integer> integerExample= Optional.ofNullable(age)
// пример использования Optional.empty()
Optional<Object> emptyExample = Optional.empty();
تو آپ کے پاس ایک اختیاری آبجیکٹ ہے۔ اب اختیاری کے لیے دو اہم طریقوں پر ایک نظر ڈالتے ہیں:
  • isPresent() - یہ طریقہ آپ کو بتاتا ہے کہ آیا اختیاری آبجیکٹ میں غیر null قدر شامل ہے۔

  • get() - موجودہ قدر کے ساتھ اختیاری کی قدر بازیافت کرتا ہے۔ آگاہ رہیں کہ get() کو خالی اختیاری پر کال کرنے کا نتیجہ NullPointerException ہوگا ۔

براہ کرم نوٹ کریں کہ اگر آپ اختیاری کے ساتھ کام کرتے وقت صرف get() اور isPresent() استعمال کرتے ہیں ، تو آپ اس سے محروم ہو جائیں گے! اسے سمجھنے کے لیے، آئیے اب اوپر کی مثال کو Optional کے ساتھ دوبارہ لکھتے ہیں۔

اختیاری کے ساتھ نال چیکنگ کو بہتر بنانا

تو ہم مندرجہ بالا کوڈ کو کیسے بہتر بنا سکتے ہیں؟ Optional کے ساتھ ہم isPresent() کا استعمال کرتے ہوئے کسی آبجیکٹ کی موجودگی کو سمجھ سکتے ہیں اور get() کا استعمال کرکے اسے بازیافت کرسکتے ہیں ۔ آئیے coffee.getSugar() کے نتیجے کو Optional کے ساتھ پیک کرکے اور isPresent() طریقہ استعمال کرکے شروع کریں ۔ اس سے ہمیں یہ تعین کرنے میں مدد ملے گی کہ آیا getSugar() null لوٹتا ہے۔
Coffee coffee = new Coffee();
Optional<String> sugar = Optional.ofNullable(coffee.getSugar());
int quantity = 0;
if (sugar.isPresent()) {
  Sugar sugar = sugar.get();
  int quantity = sugar.getQuantity();
}
اس مثال کو دیکھتے ہوئے، coffee.getSugar() کے نتیجے کو Optional میں پیک کرنے سے کوئی قدر میں اضافہ نہیں ہوتا، بلکہ پریشانی میں اضافہ ہوتا ہے۔ ہم اختیاری کلاس سے اپنے پسندیدہ فنکشنز کو استعمال کرکے نتیجہ کو بہتر بنا سکتے ہیں:
  • map(Function<? super T,? extensions U> mapper) - فراہم کردہ فنکشن میں اختیاری میں موجود قدر کا نقشہ بناتا ہے۔ اگر اختیاری پیرامیٹر خالی ہے، تو map() واپس آئے گا Optional.empty() ۔

  • orElse(T other) get() طریقہ کا ایک "خصوصی" ورژن ہے ۔ یہ اختیاری میں موجود قدر حاصل کر سکتا ہے۔ تاہم، خالی اختیاری کی صورت میں، یہ orElse() طریقہ کو پاس کی گئی قدر واپس کر دے گا ۔

طریقہ اختیاری مثال میں موجود قدر واپس کرے گا۔ لیکن اگر اختیاری پیرامیٹر خالی ہے، یعنی اس میں کوئی قدر نہیں ہے، تو orElse() اس کے طریقہ کار کے دستخط میں پاس کردہ قدر واپس کر دے گا، جسے پہلے سے طے شدہ قدر کہا جاتا ہے۔
Coffee coffee = new Coffee();

Integer quantity = Optional.ofNullable(coffee.getSugar())
    .map(it -> it.getQuantity())
    .orElse(0);
یہ واقعی اچھا ہے - کم از کم مجھے ایسا لگتا ہے۔ اب، اگر خالی ویلیو کی صورت میں ہم ڈیفالٹ ویلیو واپس نہیں کرنا چاہتے، تو ہمیں کسی قسم کی رعایت دینے کی ضرورت ہے۔ orElseThrow(Supplier<? extensions X>exceptionSupplier) اختیاری پیرامیٹرز میں موجود قدر واپس کرتا ہے، یا اختیاری خالی ہونے کی صورت میں استثناء پھینک دیتا ہے۔
Coffee coffee = new Coffee();

Integer quantity = Optional.ofNullable(coffee.getSugar())
  .map(it -> it.getQuantity())
  .orElseThrow(IllegalArgumentException::new);
جیسا کہ آپ دیکھ سکتے ہیں، اختیاری کئی فوائد فراہم کرتا ہے:
  • null چیک کا خلاصہ
  • null اشیاء کو سنبھالنے کے لیے ایک API فراہم کرتا ہے۔
  • جو کچھ حاصل کیا جا رہا ہے اس کا اظہار کرنے کے لئے اعلانیہ نقطہ نظر کی اجازت دیتا ہے۔

اختیاری کے ساتھ موثر کیسے بنیں۔

میرے کام میں، میں اختیاری کو واپسی کی قسم کے طور پر استعمال کرتا ہوں جب کوئی طریقہ "کوئی نتیجہ نہیں" حالت واپس کر سکتا ہے۔ میں عام طور پر اسے استعمال کرتا ہوں جب طریقوں کے لیے واپسی کی اقسام کی وضاحت کرتا ہوں۔
Optional<Coffee> findByName(String name) {
   ...
}
بعض اوقات یہ ضروری نہیں ہوتا ہے۔ مثال کے طور پر، اگر میرے پاس کوئی ایسا طریقہ ہے جو int کو واپس کرتا ہے ، جیسے کہ getQuantity() Sugar کلاس میں ، تو طریقہ 0 واپس کر سکتا ہے اگر نتیجہ "کوئی مقدار" کی نمائندگی کرنے کے لیے کالعدم ہے۔ اب، یہ جان کر، ہم سوچ سکتے ہیں کہ کافی کلاس میں شوگر کے پیرامیٹر کو اختیاری کے طور پر پیش کیا جا سکتا ہے۔ پہلی نظر میں، یہ ایک اچھا خیال لگتا ہے کیونکہ نظریہ میں، چینی کو کافی میں موجود ہونے کی ضرورت نہیں ہے۔ تاہم، یہ وہ جگہ ہے جہاں میں اختیاری استعمال نہ کرنے کے بارے میں بات کرنا چاہوں گا ۔ ہمیں درج ذیل حالات میں اختیاری استعمال کرنے سے گریز کرنا چاہیے:
  • POJOs کے لیے پیرامیٹر کی اقسام کے طور پر ، جیسے DTOs ۔ اختیاری سیریلائزیبل نہیں ہیں، لہذا POJO میں ان کا استعمال آبجیکٹ کی سیریلائزیبلٹی کو غیر فعال کر دیتا ہے۔

  • ایک طریقہ دلیل کے طور پر۔ اگر کوئی طریقہ دلیل null ہو سکتا ہے ، تو خالص کوڈ کے نقطہ نظر سے، null کو پاس کرنا اختیاری کو پاس کرنے سے بہتر ہے۔ مزید برآں، آپ null طریقہ دلیل کی عدم موجودگی کو خلاصہ طور پر سنبھالنے کے لیے اوورلوڈ طریقے تشکیل دے سکتے ہیں۔

  • کسی مجموعہ آبجیکٹ کی نمائندگی کرنا جو غائب ہے۔ مجموعے خالی ہوسکتے ہیں، لہذا ایک خالی مجموعہ ، جیسے خالی سیٹ یا فہرست ، کو اقدار کے بغیر کسی مجموعہ کی نمائندگی کرنے کے لیے استعمال کیا جانا چاہیے۔

نتیجہ

اختیاری جاوا لائبریری میں ایک طاقتور اضافہ بن گیا ہے۔ یہ ایسی اشیاء کو سنبھالنے کا ایک طریقہ فراہم کرتا ہے جو شاید موجود نہ ہوں۔ لہذا، بدسلوکی کے جال میں پڑنے کے بغیر طریقوں کو تیار کرتے وقت اس کو مدنظر رکھنا چاہئے۔ ہاں، آپ بہت اچھا کوڈ لکھ سکتے ہیں جو null checks اور null ہینڈلنگ کو لاگو کرتا ہے، لیکن Java کمیونٹی اختیاری استعمال کرنے کو ترجیح دیتی ہے۔ یہ مؤثر طریقے سے بتاتا ہے کہ گمشدہ اقدار کو کیسے ہینڈل کیا جائے، گندا Null چیکس کے مقابلے میں پڑھنا بہت آسان ہے، اور طویل عرصے میں آپ کے کوڈ میں کم کیڑے پیدا ہوتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION