JavaRush /وبلاگ جاوا /Random-FA /مقداردهی اولیه پرانتز دوگانه
Joysi
مرحله

مقداردهی اولیه پرانتز دوگانه

در گروه منتشر شد

1. مقداردهی اولیه پرانتز

راه‌اندازی با استفاده از پرانتزهای دوبل (که از این پس به آن مقداردهی اولیه پرانتزی گفته می‌شود ) یک ابزار جاوا برای ایجاد مجموعه‌هایی مانند لیست، مجموعه و نقشه به طور همزمان با اعلان آنها است.
مقداردهی اولیه پرانتز دوگانه - 1
هنگامی که به لیست هایی با عناصر ثابت نیاز دارید، مانند لیستی از محصولات یا ارزهای پشتیبانی شده، اعلام لیست همزمان با مقداردهی اولیه آن، خوانایی کد را بهبود می بخشد. به همین دلیل است که مقداردهی اولیه دو پرانتز محبوبیت پیدا می کند، زیرا هیچ روش استاندارد دیگری برای ایجاد مجموعه با مقداردهی اولیه همزمان در کد وجود ندارد. متأسفانه، برخلاف سایر زبان‌های برنامه‌نویسی، جاوا از مجموعه‌های لفظی پشتیبانی نمی‌کند. با توجه به این محدودیت، ایجاد یک لیست غیرقابل تغییر با حتی تعداد کمی از عناصر، ما را مجبور می کند تا خطوط کد زیادی را در قالب فراخوانی های مکرر بنویسیم add()تا عناصر مورد نظر را با بسته بندی نهایی اضافه کنیم:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
این یک توصیف غیر ضروری است که می تواند ساده شود. بیایید لیست های استاتیک را به روشی مناسب برای خود پر کنیم، یعنی مستقیماً در بلوک های ایستا در حین مقداردهی اولیه، این همان چیزی است که Double braceمقداردهی اولیه به ما کمک می کند و به ما امکان می دهد همه چیز را در یک خط بنویسیم:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
به طور مشابه، Double braceمقداردهی اولیه به ما کمک می کند تا مقادیر و HashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
همه اینها بسیار زیبا به نظر می رسند، اما دارای معایبی هستند، که باعث می شود مقداردهی اولیه پرانتز دوبل یک ضد الگو باشد. در فصل بعدی بیشتر به آنها نگاه خواهیم کرد.

جوانب مثبت و منفی راه اندازی دو پرانتز.

Doubleمقداردهی اولیه بریس از ایجاد یک کلاس داخلی ناشناس استفاده می کند . آنچه در ابتدا در سطح پنهان است، با این حال، Double braceمقداردهی اولیه یک کلاس با مقداردهی اولیه بیشتر نمونه آن هر بار که از آن استفاده می کنید، ایجاد می کند. علاوه بر این، از یک مرجع مخفی به این کلاس خصوصی استفاده شده است که می تواند ما را به نشت حافظه احتمالی برساند. شما همچنین نمی توانید از عملگر شبح برای ژنریک استفاده کنید (اپراتور الماس < >)، زیرا ما نمی توانیم به داخل یک کلاس ناشناس دسترسی پیدا کنیم.
(از مترجم: یک بار دیگر با جزئیات بیشتر:
بعد از اولی {، یک کلاس ناشناس داخلی ایجاد می شود، پس از دوم، {مقداردهی اولیه هنگام ایجاد نمونه ای از کلاس رخ می دهد که در آن به فیلدها و متدهای خارجی دسترسی داریم ( نسبت به کلاس ناشناس).)
طرفداران:
  1. کاهش خطوط در کد
  2. ایجاد و مقداردهی اولیه در یک عبارت.
معایب:
  1. ایجاد یک کلاس ناشناس که از شما پنهان است.
  2. که برای مثال هر بار که از آن استفاده می کنیم هزینه های اضافی را برای ما به همراه دارد.
  3. هر بار یک مرجع مخفی به آن ایجاد می شود که ممکن است منجر به نشت حافظه شود.
حکم: با توجه به معایب فوق و وجود جایگزین هایی برای Double brace، مقداردهی اولیه به عنوان یک ضد الگو در دنیای جاوا دیده می شود. بچه گربه را نجات دهید

جایگزین های اولیه سازی دو پرانتز در جاوا

خبر خوب این است که راه های دیگری برای رسیدن به اهداف مشابه در جاوا وجود دارد. ما می توانیم در یک خط کد ایجاد و مقداردهی اولیه یک ArrayList را با استفاده از سازنده Copy از کلاس Collection مانند شکل زیر پیاده سازی کنیم:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()لیستی از طول ثابت ارسال شده به ArrayListسازنده کپی را به ما برمی گرداند. تفاوت بین لیست های با طول ثابت بازگشتی از Arrays.asList()و را به خاطر داشته باشید Collections.unmodifiableList(): شما نمی توانید عناصر ArrayList- را اضافه یا حذف کنید، اما می توانید با استفاده از فهرست یک عنصر را تغییر دهید set()، که نمی توانید با لیستی که توسط لیست برگردانده شده است انجام دهید Collections.unmodifiableList(). اگر می خواهید یک لیست کوچک به دست آورید، این بهترین راه است، اگرچه برای مجموعه های دیگر شفافیت کمتری دارد Set، بنابراین باید Listقبل از ایجاد Set-a آن را ایجاد کنید. اما این هنوز بهتر از مقداردهی اولیه پرانتز است، زیرا در این مورد یک کلاس ناشناس داخلی اضافی در هر بار استفاده ایجاد نمی شود. اگر جاوا 8 را اجرا می کنید، روش جایگزین دیگری دارید. JDK 8 Stream API به شما کمک می کند تا مجموعه های کوچکی را با ترکیب Stream Factoryروش های خروجی در یک مجموعه ایجاد کنید List:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
برای اینکه Setمی توانید به Collectors.toSet()جای آن از روش Collectors.toList()زیر استفاده کنید:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
به هر حال، Stream collectروش‌ها تضمین نمی‌کنند که مجموعه‌هایی که تولید می‌کنند در برابر تغییرات محافظت شوند. در جاوا 8، مجموعه هایی که آنها برگردانده اند (مانند - ArrayList, HashSetو HashMap) بسیار رایج هستند (ما می توانیم آنها را تغییر دهیم)، اما این واقعیت ممکن است در نسخه های بعدی JDK اصلاح شود. این همه در حال حاضر در مورد Double braceمقداردهی اولیه در جاوا است. این قالب برای آزمایش و دمو قابل قبول است، اما برای استفاده در تولید به اندازه کافی خوب نیست. با توجه به معایب ذاتی آن، مقداردهی اولیه پرانتز دوبل این روزها به یک ضدالگو تبدیل شده است، به خصوص با توجه به جایگزین های موجود. من خودم هنوز از این ساختار برای مقداردهی اولیه نقشه های استاتیک استفاده می کنم و تمام. زیرا Listمن ترجیح می دهم Collectionsبا ترکیب با ایجاد Array.asListدر سازنده آن ایجاد کنم. و اگر از جاوا 8 استفاده کنم - طراحی با استفاده از Stream API و collect(). مقالات مرتبط: اگر از این آموزش لذت بردید و می خواهید در مورد الگوهای برنامه نویسی جاوا، اصول و بهترین شیوه ها بیشتر بدانید، ممکن است بخواهید سایر مقالات سایت ما را نیز بررسی کنید . مطالب توصیه شده: اگر می خواهید در مورد الگوها و بهترین شیوه ها بیشتر بدانید، باید برنامه نویسی موثر اثر جاشوا بلوخ را بخوانید ، هیچ کتابی نمی تواند جای آن را بگیرد. و اگر در حال حاضر به جاوا مسلط هستید و به دنبال کتابی در مورد الگوهای طراحی هستید که سبک طنز ارائه آن جالب و خواندنی باشد، به «ابتدا سر. الگوهای طراحی" .
از مترجم: من عمداً پیوندی به کتاب اصلی بلوخ ارائه کردم، زیرا ترجمه آن به روسی ناموفق است (مثلاً سازنده = سازنده).
ترجمه مقاله دبل Brace Initialization در جاوا چیست؟ نمونه ضد الگو (منتشر شده در اکتبر 2015).
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION