در صورتی که Null ندارید از Finally استفاده کنید.
با بازنگری در کدهای مربوط به نسخههای قبلی جاوا 7 خطا “try/finally” را میتوان مشاهده نمود. در این جا نحوه مدیریت منابع non-AutoCloseable و نحوه باز و بسته کردن صحیح آنها را مورد توجه قرار خواهیم داد.
اشتباهی رایج در سناریوهای “try/finally” نسخههای قدیمیتر از جاوا 7 وجود دارد، که در بیشتر کدها در زمان بازنگری مشاهده میشود. در این مقاله قصد داریم آنها را مورد توجه قرار دهیم. با ارائه نسخه 7 جاوا راهکاری برای این مسئله در نظر گرفته شد ولی این راهکار برای تمامی سناریوها راه گشا نمیباشد. در برخی مواقع نیاز به مدیریت منابعی است که لازم است به طور دستی آنها را ببندیم، بیایید آنها را به درستی باز و بسته نمائیم.
فرض کنید در جاوا 6 هستیم، کد زیر را ملاحظه نمائید:
InputStream input = null; try { input = url.openStream(); // reads the stream, throws IOException } catch (IOException ex) { throw new RuntimeException(ex); } finally { if (input != null) { input.close(); } }
قبلا در مورد null و خطاهای آن صحبت کردیم. در این جا مجددا آن را مشاهده میکنیم. در صورتی که از قانون “هرگز در هیچ بخشی از NULL استفاده نکنید”۱ تبعیت میکنید، این کد به سرعت به بازآرایی (refactoring) نیاز خواهد داشت. فرم صحیح کد مربوطه به صورت زیر خواهد بود:
final InputStream input = url.openStream(); try { // reads the stream, throws IOException } catch (IOException ex) { throw new RuntimeException(ex); } finally { input.close(); }
در این صورت null وجود ندارد و کد تمیزی خواهیم داشت. آیا این طور نیست؟
وضعیتی وجود دارد وقتی که منبعی را باز میکنیم با خطای (exception) ورودی/خروجی (IOException) مواجه میشویم و امکان قرار دادن آن خارج از try/catch نیز ممکن نمیباشد. در این زمان، ما میبایستی دو بلوک داشته باشیم:
final InputStream input; try { input = url.openStream(); } catch (IOException ex) { throw new RuntimeException(ex); } try { // reads the stream, throws IOException } catch (IOException ex) { throw new RuntimeException(ex); } finally { input.close(); }
ولی، هرگز با Null مواجه نخواهیم شد.
حضور null در کد دلیلی واضح برای وجود مشکل می باشد. در صورتی که از Null استفاده مینمایید احتمالا مشکلی وجود دارد. تنها جایی که استفاده از null را میتوان نادید گرفت استفاده از APIهای دیگر یا JDK میباشد. ممکن است برخی موارد آنها null باز گردانند، خب … درواقع به این دلیل است که آنها به درستی طراحی نشدهاند. ما راه حل دیگری نداریم ولی if(x==null) را میتوانیم استفاده کنیم. فقط همین، محل دیگری برای حضور null خوب نخواهد بود.
منبع:
https://dzone.com/articles/try-finally-if-not-null
۱ “not using NULL anywhere ever”