JavaRush /Blog Java /Random-PL /15 pytań do rozmowy kwalifikacyjnej z programistami na te...
Treefeed
Poziom 21

15 pytań do rozmowy kwalifikacyjnej z programistami na temat Enum w Javie (z odpowiedziami!)

Opublikowano w grupie Random-PL
Wyliczenie ( Enum ) zostało wprowadzone w Javie 5 i od tego czasu stało się dość popularne wśród programistów Java. Jest szeroko stosowany w różnych aplikacjach Java. Ponieważ Enum w Javie jest znacznie bardziej wszechstronne niż w C czy C++, przedstawia także wiele interesujących przypadków użycia, z których kilka widziałeś w artykule 10 sposobów użycia Enum w Javie . Jednak pomimo tej popularności wielu programistów Java wciąż nie zdaje sobie sprawy z funkcjonalności zapewnianej przez Enum i zawiłości związanych z używaniem Enum w kodzie Java. Stało się to jasne, gdy kilku czytelników pytało na przykład o zdolność Enum do implementacji interfejsu w Javie lub Dlaczego nie możemy utworzyć instancji Enum poza Enum , zauważając, że zapytano ich o to w wywiadzie. Zainspirowało nas to do stworzenia listy często zadawanych pytań w Java Enum , które nie tylko pomogą Ci odnieść sukces na rozmowach kwalifikacyjnych, ale także otworzą nowe możliwości uczenia się. Jak wspomniano wcześniej, często pytania podczas rozmów kwalifikacyjnych zmuszają Cię do poważniejszego potraktowania tematu, co nie jest złe, a biorąc pod uwagę moc i użyteczność Enum, nadszedł czas, abyś został mistrzem enum. Poniżej znajduje się lista pytań opartych na różnych funkcjonalnościach i właściwościach Enum. Można go wykorzystać jako materiał przygotowawczy do rozmowy kwalifikacyjnej lub po prostu jako przewodnik po wyliczaniu. Jeśli dopiero zaczynasz przygodę z Javą, dowiesz się wielu nowych i przydatnych rzeczy o Enum. 1) Czy Enum może zaimplementować interfejs w Javie? Tak, Enum może dziedziczyć interfejsy . Ponieważ typ Enum jest podobny do klasy i interfejsu , może dziedziczyć interfejs. Daje to w niektórych przypadkach niesamowitą elastyczność w używaniu Enum jako niestandardowej implementacji. Oto dobry przykład użycia Enum w tej roli. 2) Czy Enum może dziedziczyć (rozszerzać) klasę? Nie on nie może! Nieoczekiwane, ponieważ wcześniej powiedziano, że typ Enum jest podobny do klasy lub interfejsu w Javie. Cóż, to jest główny powód, dla którego to pytanie zadaje się zaraz po poprzednim. Ponieważ Enum dziedziczy już po klasie abstrakcyjnej java.lang.Enum , jasne jest, że inna klasa nie będzie mogła dziedziczyć, ponieważ Java nie obsługuje dziedziczenia wielu klas. Dziedzicząc z java.lang.Enum , wszystkie wyliczenia mają metody ordinal() , wartości() lub valueOf() . 3) Jak utworzyć Enum bez instancji obiektów? Czy jest to możliwe bez błędu kompilacji? To jedno z tych trudnych pytań , które uwielbiają ankieterzy. Ponieważ Enum jest postrzegane jako zbiór określonej liczby obiektów, takich jak dni tygodnia lub miesiące w roku, uzyskanie Enum bez czegokolwiek wydaje się podejrzane. Ale tak, możesz utworzyć Enum bez instancji , na przykład tworząc klasę narzędziową. To kolejny innowacyjny sposób wykorzystania Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) Czy możemy zastąpić metodę toString() dla Enum? Co się stanie, jeśli nie zdefiniujemy na nowo? Oczywiście możesz zastąpić metodę toString() Enum , tak jak możesz zastąpić dowolną klasę, która dziedziczy Java.lang.Object i ma dostępną metodę toString() , a nawet jeśli tego nie zrobisz, nic nie stracisz, ponieważ streszczenie base klasy Enum zrobi to za Ciebie i zwróci nazwę, która jest nazwą instancji Enum. Oto kod metody toString() z klasy Enum: public String toString() { return name; } nazwa jest określana, gdy kompilator przydziela kod w celu utworzenia wyliczenia w odpowiedzi na utworzenie instancji w samej klasie Enum, a także utworzenie liczby porządkowej w konstruktorze z klasa java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Jest to jedyny konstruktor służący do tworzenia enum , które jest wywoływane przez kompilator w odpowiedzi na deklarację Enum w programie. 5) Czy możemy utworzyć instancję Enum poza Enum? Dlaczego nie? Nie można utworzyć instancji Enum poza granicami Enum, ponieważ Enum nie ma publicznościkonstruktora, a kompilator nie pozwoli na wprowadzenie takiego konstruktora. Ponieważ kompilator generuje większość kodu w odpowiedzi na deklarację typu Enum, nie zezwala na publiczne konstruktory w Enums, co wymusza wewnętrzne deklarowanie instancji Enum. 6) Czy możemy określić konstruktor wewnątrz Enum? To pytanie często następuje po poprzednim. Tak, możesz, ale pamiętaj, że jest to możliwe tylko w przypadku konstruktorów prywatnych lub prywatnych z pakietem . Konstruktory z public i chronionymi nie są dozwolone w Enum. Tutaj możesz zobaczyć przykład . 7) Jaka jest różnica między porównywaniem Enum za pomocą metody == lub równości()? Jest to bardzo szerokie i trudne zagadnienie, które szczegółowo omówiliśmy tutaj . 8) Do czego służy metoda ordinal() w Enum? Metoda ordinal() zwraca kolejność, w jakiej instancje Enum są wyznaczane w Enum. Przykładowo w wyliczeniu DayOfWeek można określić kolejność dni: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } a jeśli wywołamy metodę DayOfWeek.MONDAY.ordinal() , zwróci ona 0 – co oznacza pierwszą instancję. Metoda ta jest bardzo przydatna do uporządkowania według stanu faktycznego: czyli wskazania, że ​​WTOREK (wtorek) następuje po PONIEDZIAŁKU (poniedziałek), a przed ŚRODĄ (środą). Podobnie można użyć wyliczenia do przedstawienia miesięcy w roku, gdzie luty następuje po styczniu, ale przed marcem. Wszystkie wyliczenia niestandardowe dziedziczą tę metodę z klasy abstrakcyjnej java.lang.Enum i są ustawiane przez kompilator poprzez wywołanie chronionego konstruktora w java.lang.Enum , który przyjmuje nazwę i liczbę porządkową. 9) Czy można używać Enum z TreeSet lub TreeMap w Javie? To naprawdę interesujące pytanie Enum i takie, które ludzie lubią zadawać, aby sprawdzić swoją głębokość wiedzy. Dopóki nie spojrzysz na kod java.lang.Enum , prawdopodobnie nie będziesz wiedział, że Enum dziedziczy interfejs Comparable , który jest kluczowym wymaganiem do użycia w uporządkowanych kolekcjach, takich jak TreeSet i TreeMap . Ponieważ Enum domyślnie dziedziczy interfejs Comparable , można go używać z TreeSet i TreeMap . 10) Jaka jest różnica między ordinal() i CompareTo() w Enum? Wynika to bezpośrednio z poprzedniego pytania: w rzeczywistości CompareTo() symuluje kolejność podaną przez metodę ordinal() , który jest naturalnym porządkiem Enum. Krótko mówiąc, Enum ogranicza porównania w kolejności, w jakiej są deklarowane. Warto także pamiętać, że stałe te są porównywalne tylko z innymi stałymi tego samego typu – porównywanie stałych różnych typów może prowadzić do błędu kompilatora. 11) Czy można używać Enum w obudowie przełącznika? Tak, możesz. Co więcej, jest to jedna z głównych zalet korzystania z Enum. Ponieważ instancje Enum kompilują się do stałej tymczasowej, możesz bezpiecznie wstrzyknąć je wewnątrz case i przełączyć . Oto przykład kodu z dniami tygodnia: 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 i Switch dobrze się uzupełniają, szczególnie jeśli Enum zawiera niewielką liczbę stabilnych stałych, na przykład siedem dni w tygodniu, 12 miesięcy w roku itp. Spójrz na inne przykłady użycia zmiany wielkości liter z Enum . 12) Jak iterować po całej instancji Enum? Jeśli otworzyłeś Java.lang.Enum , wiesz, że metoda wartości() zwraca tablicę wszystkich stałych Enum. Ponieważ każde wyliczenie dziedziczy Java.lang.Enum , ma ono metodę wartości() . Za jego pomocą można iterować po wszystkich stałych wyliczenia określonego typu. Spójrz na przykłady wykonania tego zadania z pętlą foreach i metodą wartości() . 13) Jakie są zalety i wady używania Enum jako singletona? Enum zapewnia szybki skrót do implementacji wzorca singletonu, a ponieważ jest nawet omówiony w książce Effective Java, jest popularnym wyborem. Na pierwszy rzut oka singleton Enum jest obiecujący i całkiem wygodny, ponieważ kontroluje tworzenie instancji, można go bezpiecznie serializować, a przede wszystkim łatwo jest utworzyć singleton bezpieczny dla wątków przy użyciu Enum. Nie musisz się już martwić podwójnym sprawdzaniem zmienności zmiennych. Przeczytaj więcej o zaletach i wadach stosowania tego podejścia tutaj . 14) Jaka jest korzyść z używania Enum zamiast wzorców wyliczeniowych int i String? Jeśli programujesz od ponad 5 lat i nadal korzystasz z JDK 1.3 lub 1.4, znasz wzorce wyliczeń String i int , które wykorzystują publiczny przedrostek stałej statycznej do reprezentowania zbioru dobrze znanych stałych liczbę rzeczy, np. dni tygodnia . Problemów jest tu sporo: nie ma niezależności od typu Enum, gdyż zmienna String odpowiedzialna za dzień tygodnia może przyjmować dowolną wartość. Podobnie przeliczalny int może przyjąć dowolną wartość, a kompilator chętnie ją połknie. I używanie Enum , otrzymujesz bezpieczeństwo typu, które kompilator sprawdza dla Ciebie. Kilka interesujących przemyśleń na ten temat znajduje się w książce Efektywna Java, którą zaleca się przeczytać wszystkim programistom Java. 15) Jak przekonwertować ciąg na Enum? To pytanie pojawia się codziennie ze względu na popularność stosowania ciągów i wyliczeń w tworzeniu aplikacji w języku Java. Najlepszym sposobem na konwersję Enum na String jest zdefiniowanie metody fabrycznej w samym Enum, która będzie pobierać argumenty String i zwracać je jako Enum . Możesz także zignorować wielkość liter. Oto kilka przykładów zamiany ciągów znaków na wyliczenia. To prowadzi nas do końca naszej listy 15 pytań ( i odpowiedzi ) na temat Enum. Ale pamiętaj: czytanie nie wystarczy, aby się uczyć, to tylko pierwszy krok . Aby skorzystać z wyliczeń, spróbuj znaleźć miejsce, w którym możesz użyć Enum w swoim projekcie - zapewni to doświadczenie w świecie rzeczywistym, a dzięki temu doświadczeniu nauczysz się więcej niż z przykładów, ponieważ napotkasz więcej problemów, z którymi możesz sobie poradzić w bardziej złożone i szczegółowe sposoby wymagania. Na te pytania dotyczące Enum warto zwrócić uwagę, aby sprawdzić swoją wiedzę, szczególnie jeśli spieszysz się na rozmowę kwalifikacyjną i po prostu nie masz czasu na szczegółowe zanurzenie się w uniwersum Enum.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION