JavaRush /Java Blog /Random-JA /Java の Enum に関する開発者インタビューの 15 の質問 (回答付き!)
Treefeed
レベル 21

Java の Enum に関する開発者インタビューの 15 の質問 (回答付き!)

Random-JA グループに公開済み
列挙 ( Enum ) はJava 5で導入され、それ以来 Java 開発者の間で非常に人気になりました。さまざまな Java アプリケーションで広く使用されています。Java の Enum は C や C++ よりもはるかに多用途であるため、多くの興味深い使用例も提供されます。そのうちの 2 つは、 「 Java で Enum を使用する 10 の方法」の記事で説明しました。しかし、この人気にもかかわらず、多くの Java プログラマは、Enum が提供する機能や、Java コードで Enum を使用する際の複雑さをまだ認識していません。 このことは、たとえば、 Java でインターフェイスを実装する Enum の機能や、 Enum の外部で Enum をインスタンス化できない理由について質問した何人かの読者から明らかになり、インタビューでこのことについて質問されたことに注目しました。これをきっかけに、私たちは Java Enum でよくある質問のリストを作成することにしました。これは、面接での成功に役立つだけでなく、新たな学習の道を開くものでもあります。前に述べたように、面接の質問では、そのトピックについてもっと真剣に取り組むよう求められることがよくありますが、これは悪いことではありません。Enum のパワーと有用性を考えると、今こそ Enum マスターになる時期です。以下は、Enum のさまざまな機能とプロパティに基づく質問のリストです。面接の準備資料として、または単に列挙するためのガイドとして使用できます。Java を初めて使用する場合は、Enum について多くの新しくて役立つことを学ぶことになります。 1) Может ли Enum наследовать (implement) интерфейс в Java? Да, Enum может наследовать интерфейсы. Поскольку Enum тип схож с классом и интерфейсом, он может наследовать интерфейс. Это даёт поразительную гибкость в использовании Enum в качестве специальной реализации в некоторых случаях. Вот неплохой пример использования Enum в таком качестве. 2) Может ли Enum наследовать (extends) класс? Нет, не может! Неожиданно, поскольку ранее говорилось что Enum тип похож на класс or интерфейс в Java. Ну, это главная причина, почему такой вопрос задают сразу за предыдущим. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы ordinal(), values() or valueOf(). 3) Как создать Enum без экземпляров an objectов? Возможно ли это без ошибки компиляции? Это один из тех хитрых вопросов, которые так любят интервьюеры. Поскольку Enum видится коллекцией определённого количества an objectов, How дни недели or месяцы в году получить Enum без ничего кажется подозрительным. Но да, вы можете создать Enum без экземпляров, например создавая утorтарный класс. Это ещё один инновационный способ использовать 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? What будет, если не будем переопределять? Конечно вы можете переопределить метод toString() у Enum, How и любого класса, наследующего java.lang.Object и имеющего метод toString() в доступности, и даже если вы не станете этого делать, ничего не потеряете, поскольку абстрактная основа класса Enum сделает это за вас, и вернёт Name, являющееся именем экземпляра Enum. Вот code метода toString() из класса Enum: public String toString() { return name; } name задано, когда компилятор выделяет code для создания перечисления в ответ на создание экземпляра в самом классе Enum, наравне с созданием порядкового числительного в конструкторе из класса java.lang.Enum: protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Это единственный конструктор для создания перечисления, который вызывается компилятором в ответ на декларирование Enum в программе. 5) Можем ли мы создать экземпляр Enum вне Enum? Почему нет? Вы не можете создавать экземпляры Enum вне границ Enum, поскольку у Enum нет public конструктора, и компилятор не позволит вам внести любой подобный конструктор. Так How компилятор генерирует большинство codeа в ответ на декларацию Enum типа, он не допускает public конструкторов внутри Enum, что заставляет объявлять экземпляры Enum внутри себя. 6) Можем ли мы указать конструктор внутри Enum? Этот вопрос часто следует за предыдущим. Да, вы можете, но помните, что подобное возможно лишь с указанием private or package-private конструкторов. Конструкторы с public и protected — не допустимы в Enum. Вот тут можно посмотреть пример. 7) Какая разница сравнивать Enum при помощи == or метода equals()? Это очень обширный и хитрый вопрос, который рассматривается подробно здесь. 8) What делает метод ordinal() в Enum? Метод ordinal() (порядковый) возвращает порядок, в котором экземпляры Enum обозначены внутри Enum. Например, в DayOfWeek Enum, вы можете указать дни по порядку: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } и если мы вызовем метод DayOfWeek.MONDAY.ordinal(), он вернёт 0 - что значит первый экземпляр. Этот метод весьма полезен для предоставления порядка в соответствии с реальным положением вещей: т. е. указывая, что TUESDAY (вторник) идёт после MONDAY (понедельника), и перед WEDNESDAY (средой). Точно так же вы можете использовать перечисление для представления месяцев года, где Февраль идёт после Января, но предшествует Марту. Все пользовательские перечисления наследуют этот метод из абстрактного класса java.lang.Enum, и они устанавливаются компилятором, вызывая protected конструктор из java.lang.Enum, который принимает Name и порядковый номер. 9) Можно использовать Enum с TreeSet or TreeMap в Java? Это действительно интересный вопрос по Enum, и его любят задавать для проверки глубины знаний. Пока вы не загляните в code java.lang.Enum, вы скорей всего не будете знать, что Enum наследует интерфейс Comparable, который является главным требованием для использования в упорядоченных коллекциях, How TreeSet и TreeMap. Поскольку Enum по умолчанию наследует интерфейс Comparable, он может использоваться с TreeSet и TreeMap. 10) Какая разница между ordinal() и compareTo() в Enum? Это прямое следование из предыдущего вопроса: на самом деле, compareTo() имитирует порядок, предоставляемый методом ordinal(), являющийся естественным порядком Enum. Если коротко, Enum ограничивает сравнения в порядке их объявления. Так же, стоит помнить, что данные константы сравнимы только с другими константами того же типа — сравнение разных типов констант может привести к ошибке компилятора. 11) Можно ли использовать Enum в switch case? Да, вы можете. Мало того, это одна из главных полезностей использования Enum. Поскольку экземпляры Enum компorруют временную константу, вы можете без опаски внедрять их внутрь 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 месяцев года и т. д. Посмотрите на другие примеры использования swith case с Enum. 12) Как пройтись по всему экземпляру Enum? Если вы открывали java.lang.Enum, то знаете, что метод values() возвращает массив всех констант Enum. Поскольку каждое перечисление наследует java.lang.Enum, они имеют метод values(). Используя его, вы можете пройтись по всем константам перечисления определённого типа. Посмотрите на примеры такого проходя с циклом foreach и методом values(). 13) Какие плюсы и минусы использования Enum в качестве синглтона? Enum предоставляет быстрый ярлык для воплощения паттерна синглтона, и поскольку об этом сказано даже в книге «Эффективная Java», такой выбор весьма популярен. На первый взгляд, синглтон Enum многообещающ и весьма удобен, например контролирует создание экземпляра, безопасно сериализуется и прежде всего, легко создать потокобезопасный синглтон с использованием Enum. Вам не нужно больше заботиться о двойной проверке волатильности переменных. Более подробно о плюсах и минусах использования такого подхода тут. 14) Какая выгода использовать Enum instead of паттернов перечисления int и перечисления String? Если вы программируете более 5 лет, и ещё застали JDK 1.3 or 1.4, вы будете на короткой ноге с паттернами перечисления String и int, где используется public static final префикс констант для представления коллекции общеизвестных фиксированных количеств вещей, How Дни Недели. Тут возникает множество проблем: у вас нет независимости типа Enum, поскольку переменная String отвечающая за день недели может принимать любое произвольное meaning. Точно так же перечисляемый int может принимать любое meaning, и компилятор спокойно проглотит это. А с использованием Enum を使用すると、コンパイラがチェックする型安全性が得られます。このトピックについては、『Effective Java』に興味深い考察がいくつかあります。すべての Java 開発者に読むことをお勧めします。 15) 文字列を列挙型に変換するにはどうすればよいですか? これは、Java アプリケーション開発で StringEnum の使用が人気になっているために、毎日寄せられる質問です。 Enum を String に変換する最良の方法は、 String引数を受け取り、それを Enumとして返すファクトリ メソッドを Enum 自体に定義することです。大文字と小文字を区別しないこともできます。 文字列を列挙型に変換する例をいくつか示します。 これで、Enum に関する 15 の質問 (および回答)のリストが終わります。 しかし、覚えておいてください。 読むだけでは学ぶのに十分ではなく、それは最初のステップにすぎません。enum の利点を活用するには、プロジェクト内で Enum を使用できる場所を見つけてみてください。これにより、実際の経験が得られ、この経験により、より多くの問題に対処できるようになるため、例からよりも多くのことを学ぶことができます。複雑かつ詳細な方法、要件。 Enum に関するこれらの質問は、特に面接のために急いでいて、Enum の世界に詳しく浸る時間がない場合に、自分の知識をテストするために注意を払う価値があります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION