JavaRush /Java блогы /Random-KK /Java тіліндегі Enum-қа қатысты әзірлеуші сұхбатының 15 сұ...
Treefeed
Деңгей

Java тіліндегі Enum-қа қатысты әзірлеуші сұхбатының 15 сұрағы (жауаптары бар!)

Топта жарияланған
Enumeration ( Enum ) Java 5 жүйесінде енгізілді және содан бері ол Java әзірлеушілері арасында өте танымал болды. Ол әртүрлі Java қолданбаларында кеңінен қолданылады. Java тіліндегі Enum C немесе C++ тілдеріне қарағанда әмбебап болғандықтан, ол көптеген қызықты пайдалану жағдайларын ұсынады, олардың бірнешеуін Java тілінде Enum пайдаланудың 10 жолы мақаласында көргенсіз . Бірақ мұндай танымалдыққа қарамастан, көптеген Java бағдарламашылары Enum ұсынған функционалдық мүмкіндіктерін және Java codeында Enum пайдаланудың қыр-сырын әлі де білмейді. Бұл, мысалы, Enum интерфейсін Java тіліндегі интерфейсті жүзеге асыру мүмкіндігі туралы сұраған бірнеше оқырмандардан анық болды немесе неге біз Enum ішінен тыс Enums іске қоса алмаймыз , олардан бұл туралы сұхбатта сұралғанын атап өтті. Бұл бізге сұхбатта табысқа жетуге көмектесіп қана қоймай, сонымен қатар оқудың жаңа жолдарын ашатын Java Enum-да жиі қойылатын сұрақтардың тізімін жасауға шабыттандырды . Жоғарыда айтылғандай, жиі сұхбат сұрақтары сізді тақырыпты байыпты қабылдауға мәжбүр етеді, бұл жаман нәрсе емес, және Enum-тың күші мен пайдалылығын ескере отырып, сіз есеп шебері боласыз. Төменде әртүрлі функциялар мен Enum қасиеттеріне негізделген сұрақтар тізімі берілген. Сіз оны сұхбатқа дайындық материалы немесе жай ғана санауға арналған нұсқаулық ретінде пайдалана аласыз. Егер сіз Java үшін жаңа болсаңыз, Enum туралы көптеген жаңа және пайдалы нәрселерді білесіз. 1) Enum интерфейсті Java тілінде жүзеге асыра алады ма? Иә, Enum интерфейстерді иелене алады . Enum түрі сыныпқа және интерфейске ұқсас болғандықтан , ол интерфейсті иелене алады. Бұл кейбір жағдайларда Enum қолданбасын пайдаланушы іске асыру ретінде пайдалануда керемет икемділік береді. Бұл сыйымдылықта Enum пайдаланудың жақсы мысалы. 2) Enum класты мұраға ала алады (кеңейтеді)? Жоқ, ол алмайды! Бұл күтпеген жағдай, себебі бұрын Enum түрі Java тіліндегі сыныпқа немесе интерфейске ұқсас деп айтылған. Бұл сұрақтың алдыңғы сұрақтан кейін қойылуының басты себебі. Enum java.lang.Enum абстрактілі сыныбынан бұрыннан мұраланғандықтан , Java бірнеше класс мұрасын қолдамайтындықтан, басқа класс мұраға алмайтыны анық. Java.lang.Enum ішінен мұраға алу арқылы барлық нөмірлерде ordinal() , values() немесе valueOf() әдістері болады . 3) Enum нысан даналары жоқ қалай жасалады? Бұл компиляция қатесіз мүмкін бе? Бұл сұхбат берушілерге ұнайтын күрделі сұрақтардың бірі . Enum белгілі бір нысандардың жиынтығы ретінде қарастырылатындықтан, апта күндері немесе жыл айлары сияқты, Enum-ды ештеңесіз алу күдікті болып көрінеді. Бірақ иә, даналары жоқ Enum жасай аласыз , мысалы, утorта класын жасау арқылы. Бұл Enum пайдаланудың тағы бір инновациялық жолы: 4) Enum үшін toString() әдісін қайта анықтай аламыз ба? Егер біз қайталамасақ не болады? Әрине, Enum бағдарламасының toString() әдісін қайта анықтауға болады, өйткені java.lang.Object мұрагері және қол жетімді toString() әдісі бар кез келген классты қайта анықтауға болады , тіпті егер жоқ болса да, сіз ештеңе жоғалтпайсыз, себебі дерексіз Enum сыныбының негізі мұны сіз үшін жасайды және Enum данасы атауы болып табылатын атауды қайтарады. Мұнда Enum сыныбынан toString() әдісінің codeы берілген: атау компилятор Enum класының өзінде дананы жасауға жауап ретінде enum жасау үшін codeты бөлгенде, сондай-ақ конструкторда реттік мәнді жасайды. java.lang.Enum класы : Бұл бағдарламадағы Enum мәлімдемесіне жауап ретінде компилятор шақыратын enum құруға арналған жалғыз конструктор . 5) 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."); } } public String toString() { return name; } protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } конструктор, ал компилятор мұндай конструкторды енгізуге мүмкіндік бермейді. Компилятор Enum түрінің мәлімдемесіне жауап ретінде көптеген codeтарды жасайтындықтан, ол Enum ішіндегі жалпы конструкторларға рұқсат бермейді , Enum даналарын ішкі түрде жариялауға мәжбүр етеді. 6) Enum ішіндегі конструкторды көрсете аламыз ба? Бұл сұрақ көбінесе алдыңғы сұраққа жауап береді. Иә, мүмкін, бірақ бұл тек жеке немесе пакеттік жеке конструкторлармен мүмкін екенін есте сақтаңыз. Enum ішінде жалпы және қорғалған конструкторларға рұқсат етілмейді. Мұнда сіз мысалды көре аласыз . 7) Enum параметрін == немесе equals() әдісімен салыстырудың айырмашылығы неде? Бұл жерде егжей-тегжейлі қарастырылған өте кең және күрделі мәселе . 8) Enum-да ordinal() әдісі не істейді? ordinal() әдісі Enum ішінде Enum даналарының тағайындалу ретін қайтарады. Мысалы, DayOfWeek Enum ішінде күндерді ретімен көрсетуге болады: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } және егер біз DayOfWeek.MONDAY.ordinal() әдісін шақырсақ , ол 0 мәнін қайтарады - бұл бірінші дананы білдіреді. Бұл әдіс заттардың нақты жағдайына сәйкес тәртіпті қамтамасыз ету үшін өте пайдалы: яғни СЕЙСЕНБІ (сейсенбі) ДҮЙСЕНБІ (дүйсенбі) кейін және СӘРСЕНБІ (Сәрсенбі) алдында келетінін көрсетеді. Сол сияқты, ақпан айы қаңтардан кейін келетін, бірақ наурыздан бұрын келетін жыл айларын көрсету үшін санауды пайдалана аласыз. Барлық теңшелетін санаулар бұл әдісті java.lang.Enum абстрактілі сыныптан мұра етеді және оларды компилятор java.lang.Enum ішіндегі қорғалған конструкторды шақыру арқылы орнатады , ол атау мен ретті қабылдайды. 9) Java тілінде TreeSet немесе TreeMap көмегімен Enum пайдалану мүмкін бе? Бұл шынымен қызықты Enum сұрағы және адамдар өздерінің терең білімдерін тексеру үшін сұрағысы келеді. Java.lang.Enum codeын қарамайынша , Enum TreeSet және TreeMap сияқты реттелген жинақтарда пайдалану үшін негізгі талап болып табылатын Салыстырмалы интерфейсті иеленетінін білмеуіңіз мүмкін . Enum әдепкі бойынша Comparable интерфейсін иеленетіндіктен , оны TreeSet және TreeMap бірге пайдалануға болады . 10) Enum ішіндегі ordinal() мен compareTo() арасындағы айырмашылық неде? Бұл алдыңғы сұрақтан тікелей туындайды: шын мәнінде, compareTo() әдіспен қамтамасыз етілген тәртіпті имитациялайды ordinal() , бұл Enum-тың табиғи тәртібі. Қысқаша айтқанда, Enum салыстыруларды жарияланған ретпен шектейді. Сондай-ақ, бұл тұрақтыларды бір типті басқа тұрақтылармен ғана салыстыруға болатынын есте ұстаған жөн - әртүрлі типтегі тұрақтыларды салыстыру компилятор қатесіне әкелуі мүмкін. 11) Enum-ды коммутатор жағдайында қолдануға болады ма? Иә, мүмкін. Сонымен қатар, бұл Enum пайдаланудың негізгі артықшылықтарының бірі. Enum даналары уақытша тұрақтыға құрастырылғандықтан, оларды case және switch ішіне қауіпсіз енгізуге болады . Міне, апта күндері бар codeтың мысалы: 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 айы және т.б. Enum көмегімен swith регистрін пайдаланудың басқа мысалдары . 12) Толық Enum данасы арқылы қалай итерациялауға болады? java.lang.Enum ашқан болсаңыз , values() әдісі барлық Enum тұрақтыларының массивін қайтаратынын білесіз . Әрбір enum java.lang.Enum мұрагері болғандықтан , оларда values() әдісі бар . Оны пайдалану арқылы белгілі бір түрдегі санаудың барлық тұрақтылары арқылы қайталауға болады. Бұл мысалдарды foreach циклімен және values() әдісімен қарастырыңыз . 13) Enum-ды синглтон ретінде пайдаланудың қандай жақсы және жағымсыз жақтары бар? Enum синглтон үлгісін енгізу үшін жылдам төте жолды қамтамасыз етеді және ол тіпті тиімді Java кітабында қамтылғандықтан, бұл танымал таңдау. Бір қарағанда, Enum синглтоны перспективалы және өте ыңғайлы, мысалы, дананы басқарады, қауіпсіз сериялануға болады және ең бастысы, Enum көмегімен ағынды қауіпсіз синглонды жасау оңай. Енді айнымалылардың құбылмалылығын екі рет тексеру туралы алаңдамаудың қажеті жоқ. Бұл тәсілді қолданудың артықшылықтары мен кемшіліктері туралы толығырақ мына жерден оқыңыз . 14) Int санау және String санау үлгілерінің орнына Enum пайдаланудың қандай пайдасы бар? Егер сіз 5 жылдан астам бағдарламалаумен айналыссаңыз және әлі де JDK 1.3 немесе 1.4 нұсқасында болсаңыз, белгілі бекітілген жинақтардың жиынын көрсету үшін жалпыға ортақ статикалық соңғы тұрақты префиксті пайдаланатын String және int санау үлгілерімен таныс боласыз. Аптаның күндері сияқты заттардың саны . Мұнда көптеген мәселелер бар: сізде Enum түрінің тәуелсіздігі жоқ, өйткені апта күніне жауапты String айнымалысы кез келген ерікті мәнді қабылдай алады. Сол сияқты, санаулы int кез келген мәнді қабылдай алады және компилятор оны қуана жұтады. Және пайдалану Enum , сіз компилятор сіз үшін тексеретін түр қауіпсіздігін аласыз. Барлық Java әзірлеушілеріне оқуға ұсынылатын Effective Java бағдарламасында осы тақырып бойынша бірнеше қызықты ойлар бар. 15) Жолды Enum түріне қалай түрлендіруге болады? Бұл Java қолданбасын әзірлеуде String және Enum қолданудың танымалдылығына байланысты туындайтын күнделікті сұрақ . Enum параметрін Жолға түрлендірудің ең жақсы жолы - Enum ішіндегі зауыттық әдісті анықтау, ол String дәлелдерін қабылдайды және оны Enum ретінде қайтарады . Сіз сондай-ақ жағдайды елемеуді қалауыңыз мүмкін. Мұнда жолдарды тізімге айналдырудың кейбір мысалдары берілген. Бұл бізді Enum туралы 15 сұрақ ( және жауаптар ) тізімінің соңына әкеледі . Бірақ есте сақтаңыз: үйрену үшін оқу жеткіліксіз, бұл тек алғашқы қадам . Санақтардың пайдасын алу үшін жобаңызда Enum қолданбасын қай жерде қолдануға болатынын табуға тырысыңыз - бұл сізге нақты тәжірибе береді және осы тәжірибе арқылы мысалдардан көбірек үйренесіз, өйткені сіз көп жағдайда шешуге болатын мәселелерге тап боласыз. күрделі және егжей-тегжейлі жолдар.талаптар. Enum туралы бұл сұрақтар сіздің біліміңізді тексеру үшін назар аударған жөн, әсіресе егер сіз сұхбатқа асығып жатсаңыз және Enum әлеміне егжей-тегжейлі енуге уақыт жоқ.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION