JavaRush /وبلاگ جاوا /Random-FA /15 سوال مصاحبه برنامه نویس در مورد Enum در جاوا (با پاسخ!...
Treefeed
مرحله

15 سوال مصاحبه برنامه نویس در مورد Enum در جاوا (با پاسخ!)

در گروه منتشر شد
Enumeration ( Enum ) در جاوا 5 معرفی شد و از آن زمان در بین توسعه دهندگان جاوا بسیار محبوب شده است. این به طور گسترده ای در برنامه های مختلف جاوا استفاده می شود. از آنجایی که Enum در جاوا بسیار تطبیق پذیرتر از C یا C++ است، موارد استفاده جالب بسیاری را نیز ارائه می دهد که یکی دو مورد از آنها را در مقاله 10 روش استفاده از Enum در جاوا مشاهده کردید . اما با وجود این محبوبیت، بسیاری از برنامه نویسان جاوا هنوز از عملکرد ارائه شده توسط Enum و پیچیدگی های استفاده از Enum در کد جاوا بی اطلاع هستند. این از چندین خوانند که مثلاً در مورد توانایی Enum برای پیاده‌سازی یک رابط در جاوا یا چرا نمی‌توانیم Enums را خارج از Enum نمونه‌سازی کنیم ، مشخص شد، و خاطرنشان کردند که در مصاحبه‌ای در این مورد از آنها سؤال شده است. این الهام بخش ما شد تا لیستی از سوالات متداول را در Java Enum جمع آوری کنیم که نه تنها به شما کمک می کند در مصاحبه موفق شوید، بلکه راه های جدیدی را برای یادگیری باز می کند. همانطور که قبلاً گفته شد، اغلب سؤالات مصاحبه شما را مجبور می کند که موضوع را جدی تر بگیرید، که چیز بدی نیست و با توجه به قدرت و مفید بودن Enum، وقت آن رسیده است که یک enum master شوید. در زیر لیستی از سوالات بر اساس عملکرد و ویژگی های مختلف Enum آمده است. شما می توانید از آن به عنوان مواد مقدماتی برای مصاحبه یا فقط راهنمای شمارش استفاده کنید. اگر با جاوا تازه کار هستید، چیزهای جدید و مفید زیادی در مورد Enum یاد خواهید گرفت. 1) آیا Enum می تواند یک رابط را در جاوا پیاده سازی کند؟ بله، Enum می‌تواند رابط‌ها را به ارث ببرد . از آنجا که نوع Enum شبیه یک کلاس و یک رابط است ، می تواند یک رابط را به ارث ببرد. این انعطاف پذیری شگفت انگیزی را در استفاده از Enum به عنوان یک پیاده سازی سفارشی در برخی موارد می دهد. در اینجا یک مثال خوب از استفاده از Enum در این ظرفیت آورده شده است. 2) آیا Enum می تواند کلاس را ارث ببرد (extends)؟ نه، او نمی تواند! غیرمنتظره، زیرا قبلا گفته شده بود که نوع Enum شبیه کلاس یا رابط در جاوا است. خب این دلیل اصلی پرسیدن این سوال درست بعد از سوال قبلی است. از آنجایی که Enum قبلاً از کلاس انتزاعی java.lang.Enum ارث می برد ، واضح است که کلاس دیگری قادر به ارث بردن نخواهد بود زیرا جاوا از وراثت چند کلاسه پشتیبانی نمی کند. با ارث بردن از java.lang.Enum ، همه enum ها دارای متدهای ordinal() ، values() یا valueOf() هستند . 3) چگونه یک Enum بدون نمونه شی ایجاد کنیم؟ آیا این کار بدون خطای کامپایل امکان پذیر است؟ این یکی از آن سوالات پیچیده ای است که مصاحبه کنندگان دوست دارند. از آنجایی که Enum به عنوان مجموعه ای از تعداد معینی از اشیاء دیده می شود، مانند روزهای هفته یا ماه های سال، دریافت Enum بدون هیچ چیز مشکوک به نظر می رسد. اما بله، می توانید یک Enum بدون نمونه ایجاد کنید ، برای مثال با ایجاد یک کلاس ابزار. این روش ابتکاری دیگری برای استفاده از Enum است: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) آیا می‌توانیم متد ()toString را برای Enum لغو کنیم؟ اگر دوباره تعریف نکنیم چه اتفاقی می افتد؟ البته می‌توانید متد ()toString Enum را نادیده بگیرید ، همانطور که می‌توانید هر کلاسی که java.lang.Object را به ارث می‌برد و دارای متد toString() در دسترس است را نادیده بگیرید، و حتی اگر این کار را نکنید، چیزی را از دست نمی‌دهید زیرا انتزاعی است. پایه کلاس Enum این کار را برای شما انجام می دهد و نام را که نام نمونه Enum است برمی گرداند. در اینجا کد متد toString() از کلاس Enum است: public String toString() { return name; } نام زمانی مشخص می شود که کامپایلر کدی را برای ایجاد یک enum در پاسخ به ایجاد یک نمونه در خود کلاس Enum و همچنین ایجاد یک ترتیبی در سازنده از کلاس java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } این تنها سازنده برای ایجاد enum است که توسط کامپایلر در پاسخ به اعلام Enum در برنامه فراخوانی می شود. 5) آیا می توانیم یک Enum را خارج از Enum نمونه سازی کنیم؟ چرا که نه؟ شما نمی توانید Enum را خارج از محدوده Enum نمونه سازی کنید زیرا Enum عمومی ندارد سازنده، و کامپایلر به شما اجازه معرفی چنین سازنده ای را نمی دهد. از آنجایی که کامپایلر اکثر کدها را در پاسخ به اعلان نوع Enum تولید می‌کند، به سازنده‌های عمومی در Enums اجازه نمی‌دهد و نمونه‌های Enum را مجبور می‌کند که به صورت داخلی اعلان شوند. 6) آیا می توانیم یک سازنده در داخل Enum مشخص کنیم؟ این سوال اغلب از سوال قبلی پیروی می کند. بله، می توانید، اما به یاد داشته باشید که این فقط با سازنده های خصوصی یا بسته خصوصی امکان پذیر است . سازندگان دارای عمومی و محافظت شده در Enum مجاز نیستند. در اینجا می توانید یک نمونه را مشاهده کنید. 7) تفاوت بین مقایسه Enum با استفاده از متد == یا ()quals چیست؟ این یک موضوع بسیار گسترده و پیچیده است که در اینجا به تفصیل پوشش داده شده است . 8) متد ()ordinal در Enum چه می کند؟ متد ()ordinal ترتیبی را برمی‌گرداند که نمونه‌های Enum در Enum تعیین می‌شوند. به عنوان مثال، در DayOfWeek Enum، می توانید روزها را به ترتیب مشخص کنید: و اگر متد DayOfWeek.MONDAY.ordinal() public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } را فراخوانی کنیم ، 0 برمی گردد - که به معنای اولین نمونه است. این روش برای ارائه نظم با توجه به وضعیت واقعی چیزها بسیار مفید است: یعنی نشان می دهد که TUESDAY (سه شنبه) بعد از دوشنبه (دوشنبه) و قبل از WEDNESDAY (چهارشنبه) می آید. به طور مشابه، می توانید از یک شمارش برای نشان دادن ماه های سال استفاده کنید، جایی که فوریه بعد از ژانویه می آید اما قبل از مارس می آید. تمام شمارش های سفارشی این متد را از کلاس انتزاعی java.lang.Enum به ارث می برند و توسط کامپایلر با فراخوانی سازنده محافظت شده در java.lang.Enum تنظیم می شوند که یک نام و یک ترتیبی می گیرد. 9) آیا امکان استفاده از Enum با TreeSet یا TreeMap در جاوا وجود دارد؟ این یک سوال Enum واقعاً جالب است و مردم دوست دارند برای آزمایش عمق دانش خود بپرسند. تا زمانی که به کد java.lang.Enum نگاه نکنید ، احتمالاً نمی دانید که Enum رابط Comparable را به ارث می برد ، که یک نیاز کلیدی برای استفاده در مجموعه های مرتب شده مانند TreeSet و TreeMap است . از آنجایی که Enum به طور پیش فرض رابط Comparable را به ارث می برد ، می توان از آن با TreeSet و TreeMap استفاده کرد . 10) تفاوت ordinal() و compareTo() در Enum چیست؟ این به طور مستقیم از سوال قبلی ناشی می شود: در واقع، compareTo() ترتیب ارائه شده توسط متد را شبیه سازی می کند ordinal() که ترتیب طبیعی Enum است. به طور خلاصه، Enum مقایسه ها را به ترتیبی که اعلام می شود محدود می کند. همچنین، شایان ذکر است که این ثابت ها فقط با سایر ثابت های هم نوع قابل مقایسه هستند - مقایسه انواع ثابت ها می تواند منجر به خطای کامپایلر شود. 11) آیا می توان از Enum در کیس سوئیچ استفاده کرد؟ بله، تو میتونی. علاوه بر این، این یکی از مزایای اصلی استفاده از Enum است. از آنجایی که نمونه‌های Enum به یک ثابت موقت کامپایل می‌شوند، می‌توانید با خیال راحت آنها را داخل کیس و سوئیچ تزریق کنید . در اینجا یک مثال از کد با روزهای هفته آورده شده است: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum و Switch به خوبی یکدیگر را تکمیل می کنند، به خصوص اگر Enum دارای تعداد کمی ثابت ثابت باشد، به عنوان مثال، هفت روز هفته، 12 ماه از سال، و غیره. نمونه های دیگر استفاده از swith case با Enum . 12) چگونه می توان از طریق کل یک نمونه Enum تکرار کرد؟ اگر java.lang.Enum را باز کرده باشید ، می دانید که متد values() آرایه ای از تمام ثابت های Enum را برمی گرداند. از آنجایی که هر enum java.lang.Enum را به ارث می برد ، آنها یک متد values() دارند . با استفاده از آن، می توانید تمام ثابت های یک شمارش از نوع خاصی را تکرار کنید. به نمونه هایی از این مورد که با یک حلقه foreach و متد values() می گذرد نگاه کنید . 13) مزایا و معایب استفاده از Enum به عنوان تک تن چیست؟ Enum یک میانبر سریع برای پیاده سازی الگوی singleton ارائه می دهد، و از آنجایی که حتی در کتاب Effective Java پوشش داده شده است، انتخاب محبوبی است. در نگاه اول، Enum singleton امیدوارکننده و بسیار راحت است، از جمله اینکه نمونه سازی را کنترل می کند، به طور ایمن قابل سریال سازی است، و مهمتر از همه، ایجاد یک سینگل ایمن با نخ با استفاده از Enum آسان است. دیگر نیازی نیست نگران بررسی مضاعف نوسانات متغیرها باشید. درباره مزایا و معایب استفاده از این روش در اینجا بیشتر بخوانید . 14) مزیت استفاده از Enum به جای int enumeration و الگوهای string enumeration چیست؟ اگر بیش از 5 سال است که برنامه نویسی می کنید و هنوز در JDK 1.3 یا 1.4 هستید، با الگوهای شمارش رشته و int آشنا خواهید شد که از یک پیشوند ثابت نهایی ثابت عمومی برای نمایش مجموعه ای از ثابت های شناخته شده استفاده می کنند. تعدادی چیز، مانند روزهای هفته . در اینجا مشکلات زیادی وجود دارد: شما از نوع Enum استقلال ندارید، زیرا متغیر String مسئول روز هفته می‌تواند هر مقدار دلخواه را بگیرد. به همین ترتیب، یک int قابل شمارش می تواند هر مقداری را به خود بگیرد و کامپایلر با خوشحالی آن را می بلعد. و با استفاده از Enum ، نوع ایمنی را دریافت می کنید که کامپایلر برای شما بررسی می کند. در Effective Java افکار جالبی در مورد این موضوع وجود دارد که خواندن آن به همه توسعه دهندگان جاوا توصیه می شود. 15) چگونه رشته را به Enum تبدیل کنیم؟ این یک سوال روزانه است که به دلیل محبوبیت استفاده از String و Enum در توسعه برنامه جاوا مطرح می شود. بهترین راه برای تبدیل Enum به String این است که یک متد کارخانه ای در خود Enum تعریف کنید که آرگومان های String را می گیرد و آن را به عنوان Enum برمی گرداند . همچنین ممکن است بخواهید حروف بزرگ را نادیده بگیرید. در اینجا چند نمونه از تبدیل رشته ها به شمارش آورده شده است. این ما را به پایان فهرست 15 سؤالی ( و پاسخ ) درباره Enum می رساند. اما به یاد داشته باشید: خواندن برای یادگیری کافی نیست، فقط اولین قدم است . برای بهره مندی از enums، سعی کنید مکان هایی را که می توانید از Enum در پروژه خود استفاده کنید پیدا کنید - این به شما تجربه دنیای واقعی می دهد و با این تجربه بیشتر از نمونه ها یاد خواهید گرفت، زیرا با مشکلات بیشتری روبرو خواهید شد که می توانید در موارد بیشتری از پس آنها برآیید. راه های پیچیده و دقیق. این سوالات در مورد Enum ارزش توجه به آنها را دارد تا دانش خود را آزمایش کنید، به خصوص اگر برای مصاحبه عجله دارید و زمانی برای غوطه وری دقیق در جهان Enum وجود ندارد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION