انواع 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 دشوار است و میتواند موجب بروز باگ در کد شود. استفاده از آنها منجر به عواقبی میشود که میتواند فاجعهبار باشد و متأسفانه اغلب این فجایع در زمان اجرا رخ میدهند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی جاوا (Java)
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای جاوا (Java)
- زبان برنامهنویسی جاوا (Java) — از صفر تا صد
- متدهای جاوا — به زبان ساده
==