مجموعههای جاوا: ابزارهای پنهانی که از دست میدهید
اکثر توسعهدهندگان هر روز از مجموعههای جاوا (Java collections) به یک شکل استفاده میکنند. آنها از ArrayList و HashSet استفاده میکنند. اما ممکن است ابزارهایی را از دست داده باشید که کد شما را سریعتر و ایمنتر میکنند.
در اینجا سه ابزار خاص برای بهبود کد شما آورده شده است.
۱. Arrays.asList یک List واقعی نیست
وقتی از Arrays.asList(array) استفاده میکنید، یک لیست با اندازه ثابت (fixed-size) دریافت میکنید. این لیست مستقیماً به آرایه اصلی شما متصل است.
- اگر آرایه را تغییر دهید، لیست هم تغییر میکند.
- اگر سعی کنید آیتمی را اضافه یا حذف کنید، کد شما با خطا متوقف میشود.
برای رفع این مشکل، آن را در یک ArrayList جدید قرار دهید:
List<String> list = new ArrayList<>(Arrays.asList(array));
این کار یک لیست واقعی و مستقل ایجاد میکند که میتوانید آن را تغییر دهید.
۲. برای عملکرد بهتر از EnumSet استفاده کنید
آیا enumها را در یک HashSet ذخیره میکنید؟ این کار باعث ایجاد سربار (overhead) غیرضروری میشود. HashSetها از جداول هش (hash tables) و هدرهای شیء (object headers) استفاده میکنند.
در عوض از EnumSet استفاده کنید. این مجموعه در داخل از یک بردار بیت (bit vector) استفاده میکند. بسیار سریع است و تقریباً هیچ حافظهای اشغال نمیکند. برای سیستمهای مبتنی بر پرچم (flag-based) مانند قدرتهای بازیکن یا تنظیمات، عالی است.
- از نظر نوع (type-safe) ایمن است.
- بسیار سریعتر از
HashSetاست. - عملیات بیتی (bitwise operations) را برای شما مدیریت میکند.
۳. برای کشها (caches) از ConcurrentHashMap.computeIfAbsent استفاده کنید
اگر یک کش میسازید، اغلب کد پیچیدهای مینویسید تا از محاسبه یک مقدار توسط چندین رشته (thread) جلوگیری کنید. این کار «قفل دو مرحلهای» (double-checked locking) نامیده میشود که خواندن آن سخت و خراب کردن آن آسان است.
در عوض، از یک خط کد استفاده کنید:
cache.computeIfAbsent(key, this::expensiveCalculation);
این متد اتمیک (atomic) است. تضمین میکند که محاسبه فقط یک بار انجام شود، حتی اگر چندین رشته همزمان درخواست کلید یکسانی را داشته باشند. این کار باگها را کاهش داده و هدف شما را شفاف میکند.
چرا این ابزارها اهمیت دارند:
- عملکرد قابل پیشبینی: از هزینههای پنهان حافظه جلوگیری میکنید.
- باگهای کمتر: از درگیری با شرایط رقابتی (race conditions) در کدهای چندرشتهای جلوگیری میکنید.
- کد شفافتر: سایر توسعهدهندگان بلافاصله طراحی شما را درک میکنند.
از جنگیدن با فریمورک دست بردارید. شروع کنید به استفاده از آن برای نوشتن کدی سبکتر و ایمنتر.