𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀: 𝗧𝗵𝗲 𝗛𝗶𝗱𝗱𝗲𝗻 𝗧𝗼𝗼𝗹𝘀 𝗬𝗼𝘂 𝗠𝗶𝘀𝘀
Більшість розробників щодня використовують Java collections однаково. Вони використовують ArrayLists та HashSets. Але ви можете пропускати інструменти, які зроблять ваш код швидшим і безпечнішим.
Ось три конкретні інструменти для покращення вашого коду.
- Arrays.asList — це не справжній List
Коли ви використовуєте Arrays.asList(array), ви отримуєте список фіксованого розміру. Він пов'язаний безпосередньо з вашим початковим масивом.
- Якщо ви зміните масив, список також зміниться.
- Якщо ви спробуєте додати або видалити елементи, ваш код завершиться помилкою.
Щоб виправити це, обгорніть його в новий ArrayList:
List<String> list = new ArrayList<>(Arrays.asList(array));
Це створює справжній, незалежний список, який ви можете змінювати.
- Використовуйте EnumSet для продуктивності
Ви зберігаєте enums у HashSet? Це створює зайві витрати ресурсів. HashSets використовують хеш-таблиці та заголовки об'єктів.
Замість цього використовуйте EnumSet. Він використовує бітовий вектор внутрішньо. Він надзвичайно швидкий і майже не споживає пам'яті. Він ідеально підходить для систем на основі прапорців (flags), таких як здібності гравця або налаштування.
- Він забезпечує типізацію (type-safe).
- Він набагато швидший за HashSet.
- Він виконує побітові операції за вас.
- Використовуйте ConcurrentHashMap.computeIfAbsent для кешів
Якщо ви створюєте кеш, ви часто пишете складний код, щоб запобігти розрахунку одного й того самого значення кількома потоками. Це називається double-checked locking. Такий код важко читати, і в ньому легко припуститися помилки.
Замість цього використайте один рядок:
cache.computeIfAbsent(key, this::expensiveCalculation);
Цей метод є атомарним. Він гарантує, що розрахунок виконається лише один раз, навіть якщо багато потоків запитують один і той самий ключ одночасно. Це зменшує кількість багів і робить ваші наміри зрозумілими.
Чому ці інструменти важливі:
- Передбачувана продуктивність: ви уникаєте прихованих витрат пам'яті.
- Менше багів: ви припиняєте боротися зі станами гонитви (race conditions) у багатопотоковому коді.
- Чистіший код: інші розробники одразу розуміють вашу архітектуру.
Досить боротися з фреймворком. Почніть використовувати його, щоб писати лаконічніший і безпечніший код.