انواع Raw در جاوا — از صفر تا صد

۹۸ بازدید
آخرین به‌روزرسانی: ۰۶ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
انواع Raw در جاوا — از صفر تا صد

در این راهنمای کوچک قصد داریم به بررسی انواع Raw در جاوا بپردازیم و در مورد ماهیت آن‌ها و این که چرا باید از آن‌ها استفاده نکنیم توضیح دهیم.

انواع Raw در جاوا

منظور از نوع Raw یک نام برای اینترفیس ژنریک یا کلاسی بدون آرگومان نوع است:

1List list = new ArrayList(); // raw type

که به جای کد زیر نوشته می‌شود:

1List<Integer> listIntgrs = new ArrayList<>(); // parameterized type

<List<Integer یک نوع پارامتردار از اینترفیس <List<E است، در حالی که List یک نوع Raw از اینترفیس <List<E محسوب می‌شود. انواع Raw در زمان ساخت اینترفیس با کدهای قدیمی غیر ژنریک می‌توانند مفید واقع شوند، اما در موارد دیگر توصیه می‌شود از آن‌ها استفاده نشود زیرا:

  • گویا نیستند.
  • فاقد ایمنی نوع هستند.
  • و مشکلات در زمان اجرا و نه در زمان کامپایل مشاهده می‌شوند.

انواع Raw غیر گویا هستند

یک نوع Raw خود را به روشی که انواع پارامتردار بیان می‌کنند، توضیح نمی‌دهد و مستندسازی نمی‌کند. برای نمونه به سادگی می‌توانیم استنباط کنیم که یک نوع پارامتردار به صورت List<String>‎ یک لیست است که شامل رشته‌ها می‌شود. با این حال یک نوع Raw فاقد این شفافیت است و به همین جهت کار با آن و با متدهای API آن دشوار می‌شود.

به امضای متد get(int index) در اینترفیس List دقت کنید، تا این موضوع را بهتر درک کنید:

1/**
2 * Returns the element at the specified position in this list.
3 *
4 * @param index index of the element to return
5 * @return the element at the specified position in this list
6 * @throws IndexOutOfBoundsException if the index is out of range
7 *         (<tt>index < 0 || index >= size()</tt>)
8 */
9E get(int index);

متد get(int index) یک رشته در موقعیت index در نوع پارامتردار <List<String بازگشت می‌دهد. با این حال در مورد نوع خام List یک Object بازگشت می‌دهد. از این رو باید تلاش مضاعفی برای بررسی و شناسایی نوع عنصر در نوع خام List به عمل آوریم و یک تبدیل نوع مناسب اجرا کنیم. این کار می‌تواند موجب بروز باگ در زمان اجرا شود ، زیرا نوع Raw دارای ایمنی نوع (Type-Safe) نیست.

انواع Raw دارای ایمنی نوع نیستند

هنگام استفاده از انواع Raw رفتاری مربوط به قبل از ژنریک‌ها به دست می‌آوریم. از این رو یک List از نوع Raw یک Object می‌پذیرد و می‌تواند یک عنصر از هر نوع داده‌ای نگهداری کند. به این ترتیب با مشکلات ایمنی نوع در زمان ترکیب کردن انواع پارامتر دارو Raw می‌شود.

این وضعیت را با بررسی کد زیر بهتر می‌بینیم. در این کد ابتدا یک وهله از <List<String ساخته شده و سپس به متدی ارسال می‌شود که نوع Raw به صورت List می‌پذیرد و یک عدد صحیح به آن اضافه می‌کند:

1public void methodA() {
2    List<String> parameterizedList = new ArrayList<>();
3    parameterizedList.add("Hello Folks");
4    methodB(parameterizedList);
5}
6 
7public void methodB(List rawList) { // raw type!
8    rawList.add(1);
9}

این کد با یک هشدار کامپایل می‌شود و در زمان اجرا عدد صحیح به List نوع Raw اضافه می‌شود. List<String>‎ که به صورت یک آرگومان ارسال شده است، اینک شامل یک رشته و یک عدد صحیح است. کامپایلر به دلیل استفاده از انواع Raw یک هشدار پرینت می‌کند:

Note: RawTypeDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

مشکلات زمان اجرا

فقدان ایمنی نوع در انواع RAW یک تأثیر علّی دارد که منجر به بروز استثناهایی در زمان اجرا می‌شود. اینک مثال قبلی را طوری ویرایش می‌کنیم که methodA پس از فراخوانی methodB عنصر را در موقعیت اندیس 1 <List<String دریافت کند:

1public void methodA() {
2    List<String> parameterizedList = new ArrayList<>();
3    parameterizedList.add("Hello Folks");
4    methodB(parameterizedList);
5    String s = parameterizedList.get(1);
6}
7 
8public void methodB(List rawList) {
9    rawList.add(1);
10}

کد کامپایل می‌شود و در زمان اجرا یک استثنا به صورت ClassCastException ارائه می‌کند. این اتفاق در متد get(int index) می‌افتد که یک عدد صحیح بازگشت می‌دهد و نمی‌تواند به یک متغیر از نوع String انتساب یابد:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

سخن پایانی

کار با انواع Raw دشوار است و می‌تواند موجب بروز باگ در کد شود. استفاده از آن‌ها منجر به عواقبی می‌شود که می‌تواند فاجعه‌بار باشد و متأسفانه اغلب این فجایع در زمان اجرا رخ می‌دهند.

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

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *