بررسی تأثیر Enum بر عملکرد اپلیکیشن اندروید — به زبان ساده



تعداد بازدید ها:
6

در زمان کار روی اپلیکیشن‌های اندرویدی در موارد مختلف از انواع Enums استفاده می‌کنیم، چون کارآمد هستند، اما ممکن است تأثیر کامل آن‌ها را روی اپلیکیشن اندرویدی ندانید. Enums یک روش آسان محسوب می‌شوند، اما متأسفانه زمانی که به مصرف حافظه آن‌ها و سرعتشان نگاه می‌کنیم نتایج خوشایندی نمی‌بینیم. در این مقاله به بررسی تأثیر Enums بر عملکرد اپلیکیشن اندروید می‌پردازیم.

Enum چیست؟

Enum در جاوا یک نوع داده است که شامل مجموعه مشخصی از ثابت‌ها است. این یک نوع داده خاص است که به ما امکان می‌دهد یک متغیر را روی یکی از مقادیر ثابت از پیش تعیین‌شده تنظیم کنیم. متغیر آن باید برابر با یکی از مقادیری باشد که از قبل برایش تعریف شده است.

چرا باید از Enum استفاده کنیم؟

ما از Enum در مواردی استفاده می‌کنیم که یک متغیر بتواند تنها یک مقدار را از میان یک مجموعه از مقادیر ممکن بگیرد. به مثال زیر توجه کنید:


اکنون enum به نام Fruits تنها یک مقدار می‌تواند بگیرد و هیچ مقدار دیگری به جز آن چه برایش تعریف شده است وجود ندارد. اما در حالتی که از یک عدد صحیح یا ثابت رشته‌ای استفاده کنیم، ممکن است ثابت‌های غیرمجازی را به آن ارسال کنیم. بنابراین برای جلوگیری از این خطاهای ثابت غیرمجاز و برای افزایش بررسی‌ها در زمان کامپایل به طور کلی از یک enum استفاده می‌کنیم.

هزینه Enum-ها

مقادیر Enum در مقایسه با یک ثابت int حافظه بیشتری مصرف می‌کنند. افزودن یک Enum منفرد موجب افزایش اندازه فایل DEX نهایی به میزان 13 برابر در قیاس با استفاده از ثابت صحیح می‌شود. دلیل این امر آن است که هر مقدار در یک کلاس Enum به عنوان یک شیء تلقی می‌شود و هر مقدار بخشی از حافظه هیپ را برای ارجاع به شیء اشغال می‌کند. این وضعیت موجب مصرف شدن حافظه زیادی می‌شود.

شاید حتی اطلاع نداشته باشید که استفاده از Enum موجب تأثیر روی عملکرد اپلیکیشن می‌شود. شاید نوشتن یک یا دو enum روی عملکرد کلی اپلیکیشن تأثیر قابل توجهی نداشته باشد، اما اگر از برخی کلاس‌های Enum در اپلیکیشن خود استفاده می‌کنید و برخی کتابخانه‌ها وجود دارند که از کلاس‌های Enum دیگری استفاده می‌کنند، در مجموع تأثیر عمده‌ای روی اپلیکیشن داشته باشند و اندازه فایل را افزایش داده و روی عملکرد اپلیکیشن نیز تأثیر سوئی بگذارند.

نکته: به طور کلی استفاده از Enum-ها در هیچ بخشی از کد اپلیکیشن توصیه نمی‌شود.

راه‌حل

اندروید از طیف متنوعی از حاشیه‌نویسی‌ها از طریق کتابخانه Annotations Support پشتیبانی می‌کند. از طریق پکیج android.support.annotation می‌توانید به این کتابخانه دسترسی داشته باشید. این کتابخانه حاشیه‌نویسی از نوع TypeDef دارد. این حاشیه‌نویسی وجود یک پارامتر خاصی، مقدار بازگشتی، یا فیلدی که به مجموعه خاصی از ثابت‌ها ارجاع می‌دهد را تضمین می‌کند. همچنین موجب می‌شود تکمیل کد به صورت خودکار، ثابت‌های مجاز را پیشنهاد کند.

IntDef@ و StringDef@ دو مورد از حاشیه‌نویسی‌های ثابت هستند که می‌توانند به جای enums برای ثابت‌های int و رشته‌ای استفاده شوند و موجب ایمنی زمان build می‌شوند. این حاشیه‌نویسی‌ها به ما کمک می‌کنند که آرگومان‌های متغیر را به روشی مانند enum-ها در زمان کامپایل بررسی کنیم.

چگونه از Annotations استفاده کنیم؟

این موضوع را با طرح یک مثال بررسی می‌کنیم. فرض کنید کلاس Fruit را با مجموعه‌ای از ثابت‌های int داریم. بنابراین در زمان ایجاد شیء باید مقدار نوع int را از مجموعه موجود ارسال کنیم. اما در متد main یک مقدار ارسال می‌کنیم که در مجموعه ثابت‌ها وجود ندارد و منجر به موقعیت مشکل سازی می‌شود. در قطعه کد زیر هیچ نوع «امنیت نوع» (type safety) وجود ندارد:


در ادامه پیاده‌سازی کد مشابهی وجود دارد که از enums به صورت زیر استفاده می‌کند:


وابستگی حاشیه‌نویسی پشتیبانی را در build.gradle سطح اپلیکیشن اضافه می‌کنیم:


ثابت‌ها و IntDef@ را برای این ثابت‌ها اعلان می‌کنیم:


در مثال فوق حاشیه‌نویسی Typedef از موارد زیر استفاده می‌کند:

  • از interface@ برای اعلان نوع حاشیه‌نویسی شمارشی جدید استفاده می‌کند.
  • از حاشیه‌نویسی‌های IntDef@ و StringDef@ همراه با Retentio@ استفاده می‌کند که برای تعریف نوع شمارشی ضروری هستند.

حاشیه‌نویسی Retention(RetentionPolicy.SOURCE)@ به کامپایلر اعلام می‌کند که داده‌های حاشیه‌نویسی شمارشی را در فایل.class ذخیره نکند.

Setter-ها و getter-ها را می‌توان به صورت زیر تعریف کرد:


اگر Proguard به درستی پیکربندی شده باشد، می‌تواند enum-ها را به نیابت از ما در پاره‌ای یا بسیاری از موقعیت‌ها به صورت مقادیر int بهینه‌سازی کند. بنابراین جای نگرانی وجود ندارد.

سخن پایانی

Enum-ها در مقایسه با ثابت‌های ساده دست کم دو برابر به بایت‌های اندازه کلی APK اضافه می‌کنند و در مقایسه با ثابت‌های معادل حدود 5 تا 10 برابر RAM بیشتری اشغال می‌کنند. از این رو اگر می‌خواهید اپلیکیشن شما از نظر مصرف حافظه و عملکرد بهینه باشد، باید از استفاده از enum-ها در کد خود اجتناب کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==