Как преобразовать перечисление (enum) в строку

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Java предоставляет различные типы данных для решения различных программных задач. Тип данных enum (перечисление) особенно полезен для определения набора именованных констант, таких как дни недели, месяцы года или коды состояния. Хотя перечисления являются мощным средством для обеспечения целостности кода, бывают ситуации, когда вам нужно преобразовать значения перечислений в строки, особенно при работе с пользовательскими интерфейсами, API или базами данных. В этом LabEx вы узнаете о различных методах преобразования перечислений Java в строки и рассмотрите альтернативные подходы к обработке констант.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_attributes("Class Attributes") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/enums("Enums") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/for_loop -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/classes_objects -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/class_attributes -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/oop -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/interface -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/enums -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/object_methods -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} java/string_methods -.-> lab-117421{{"Как преобразовать перечисление (enum) в строку"}} end

Создание и понимание перечислений (enums) в Java

Начнем с понимания, что такое перечисление (enum) и как его создать в Java. Перечисление - это специальный тип данных, который позволяет переменной принимать значения из набора предопределенных констант.

Сначала нам нужно создать файл Java для работы. В WebIDE перейдите в каталог проекта и создайте новый файл с именем CourseExample.java:

public class CourseExample {
    // Define an enum for different courses
    enum Course {
        JAVA, ANDROID, HTML, CSS
    }

    public static void main(String[] args) {
        // Print all enum values
        System.out.println("Available courses:");
        for (Course course : Course.values()) {
            System.out.println("- " + course);
        }

        // Access a specific enum value
        Course myCourse = Course.JAVA;
        System.out.println("\nMy selected course is: " + myCourse);
    }
}
compile and run

Скомпилируем и запустим этот код:

cd ~/project/enum_examples
javac CourseExample.java
java CourseExample

Вывод должен выглядеть следующим образом:

Available courses:
- JAVA
- ANDROID
- HTML
- CSS

My selected course is: JAVA

В этом примере:

  • Мы определили перечисление с именем Course с четырьмя константами: JAVA, ANDROID, HTML и CSS.
  • Мы использовали метод values(), чтобы получить все константы перечисления в виде массива, а затем прошли по ним в цикле.
  • Мы также показали, как получить доступ к конкретному значению перечисления, указав имя перечисления, за которым следует имя константы.

Когда вы напрямую выводите значение перечисления, Java использует метод toString(), который по умолчанию возвращает имя константы.

Преобразование перечисления (enum) в строку с использованием метода name()

Перечисления (enums) в Java предоставляют встроенный метод name(), который возвращает точное имя константы перечисления в виде строки. Этот метод особенно полезен, когда вам нужна точная строковая репрезентация, как определено в коде.

Создадим новый файл с именем EnumNameExample.java:

public class EnumNameExample {
    enum Course {
        JAVA, ANDROID, HTML, CSS
    }

    public static void main(String[] args) {
        System.out.println("Converting enum to string using name() method:");

        // Get all enum values
        Course[] courses = Course.values();

        // Loop through each enum value and convert to string using name()
        for (Course course : courses) {
            String courseName = course.name();
            System.out.println("Enum: " + course + " | String: " + courseName);
        }

        // Example use case: Case conversion
        Course selectedCourse = Course.HTML;
        String courseString = selectedCourse.name();
        System.out.println("\nOriginal: " + courseString);
        System.out.println("Lowercase: " + courseString.toLowerCase());
        System.out.println("Proper case: " + courseString.charAt(0) + courseString.substring(1).toLowerCase());
    }
}

Теперь скомпилируем и запустим этот код:

cd ~/project/enum_examples
javac EnumNameExample.java
java EnumNameExample

Вы должны увидеть такой вывод:

Converting enum to string using name() method:
Enum: JAVA | String: JAVA
Enum: ANDROID | String: ANDROID
Enum: HTML | String: HTML
Enum: CSS | String: CSS

Original: HTML
Lowercase: html
Proper case: Html

Метод name() возвращает точное имя константы перечисления, как оно определено в коде. Это позволяет вам:

  1. Получить точное имя константы для хранения или ссылки.
  2. Выполнять строковые операции, такие как преобразование в нижний или верхний регистр.
  3. Сравнивать строковую репрезентацию перечисления с другими строками.

Обратите внимание, что строки, возвращаемые методом name(), всегда в верхнем регистре для стандартных объявлений перечислений, совпадая с тем, как они появляются в коде.

Настройка строкового представления с помощью метода toString()

В то время как метод name() возвращает точное имя константы перечисления (enum), иногда вам может понадобиться настроить, как перечисление отображается в виде строки. Именно здесь переопределение метода toString() может быть полезным.

Создадим новый файл с именем EnumToStringExample.java:

public class EnumToStringExample {
    // Define an enum with a custom string representation
    enum Course {
        JAVA("Java Programming"),
        ANDROID("Android Development"),
        HTML("HTML Basics"),
        CSS("CSS Styling");

        // Field to store the custom string description
        private String courseName;

        // Constructor to initialize the custom string
        Course(String courseName) {
            this.courseName = courseName;
        }

        // Override toString() to return the custom string
        @Override
        public String toString() {
            return this.courseName;
        }
    }

    public static void main(String[] args) {
        System.out.println("Custom string representation using toString():");

        // Print each course using the overridden toString() method
        for (Course course : Course.values()) {
            System.out.println(course.name() + " => " + course.toString());
        }

        // Direct use of toString() (happens automatically when printing an object)
        Course myCourse = Course.ANDROID;
        System.out.println("\nMy course is: " + myCourse);

        // Comparing the two methods
        System.out.println("\nComparison between name() and toString():");
        System.out.println("name(): " + myCourse.name());
        System.out.println("toString(): " + myCourse.toString());
    }
}

Скомпилируем и запустим этот код:

cd ~/project/enum_examples
javac EnumToStringExample.java
java EnumToStringExample

Вы должны увидеть такой вывод:

Custom string representation using toString():
JAVA => Java Programming
ANDROID => Android Development
HTML => HTML Basics
CSS => CSS Styling

My course is: Android Development

Comparison between name() and toString():
name(): ANDROID
toString(): Android Development

В этом примере:

  1. Мы определили перечисление с конструктором, который принимает строковой параметр.
  2. Каждая константа перечисления инициализируется с помощью пользовательского строкового описания.
  3. Мы переопределили метод toString() для возврата этого пользовательского текста.
  4. Когда мы напрямую выводим перечисление, Java автоматически вызывает метод toString().

Этот подход позволяет вам предоставить более удобочитаемое или отформатированное строковое представление констант перечисления, что может быть полезно для:

  • Отображения перечислений в пользовательском интерфейсе.
  • Создания более читаемых журналов сообщений.
  • Генерации отформатированных отчетов.
  • Международной локализации вашего приложения.

Обратите внимание, что метод name() по-прежнему возвращает исходное имя константы, в то время как toString() возвращает наш пользовательский текст.

Альтернативные способы объявления констант в Java

Хотя перечисления (enums) являются рекомендуемым способом определения фиксированного набора констант в Java, существуют альтернативные подходы, которые использовались до появления перечислений в Java 5. Исследуем эти альтернативы, чтобы получить полное представление.

Создайте файл с именем ConstantsExample.java:

public class ConstantsExample {
    // Approach 1: Static final fields in a class
    static class CourseClass {
        public static final String JAVA = "Java Programming";
        public static final String ANDROID = "Android Development";
        public static final String HTML = "HTML Basics";
        public static final String CSS = "CSS Styling";
    }

    // Approach 2: Interface with constants
    interface CourseInterface {
        String JAVA = "Java Programming"; // implicitly public, static, and final
        String ANDROID = "Android Development";
        String HTML = "HTML Basics";
        String CSS = "CSS Styling";
    }

    // Approach 3: Enum (modern approach)
    enum CourseEnum {
        JAVA("Java Programming"),
        ANDROID("Android Development"),
        HTML("HTML Basics"),
        CSS("CSS Styling");

        private String description;

        CourseEnum(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    public static void main(String[] args) {
        // Using static final fields
        System.out.println("Using static final fields:");
        System.out.println(CourseClass.JAVA);
        System.out.println(CourseClass.ANDROID);

        // Using interface constants
        System.out.println("\nUsing interface constants:");
        System.out.println(CourseInterface.HTML);
        System.out.println(CourseInterface.CSS);

        // Using enum with custom getter method
        System.out.println("\nUsing enum with custom getter method:");
        System.out.println(CourseEnum.JAVA.name() + ": " + CourseEnum.JAVA.getDescription());
        System.out.println(CourseEnum.ANDROID.name() + ": " + CourseEnum.ANDROID.getDescription());

        // Advantages of enums demonstration
        System.out.println("\nAdvantages of enums:");
        System.out.println("1. Type safety - can't assign invalid values:");
        CourseEnum course = CourseEnum.HTML;
        // This would cause a compilation error:
        // course = "Invalid"; // Uncommenting this line would cause an error

        System.out.println("2. Can be used in switch statements:");
        switch(course) {
            case JAVA:
                System.out.println("  Selected Java course");
                break;
            case HTML:
                System.out.println("  Selected HTML course");
                break;
            default:
                System.out.println("  Other course");
        }
    }
}

Теперь скомпилируйте и запустите код:

cd ~/project/enum_examples
javac ConstantsExample.java
java ConstantsExample

Вы должны увидеть такой вывод:

Using static final fields:
Java Programming
Android Development

Using interface constants:
HTML Basics
CSS Styling

Using enum with custom getter method:
JAVA: Java Programming
ANDROID: Android Development

Advantages of enums:
1. Type safety - can't assign invalid values:
2. Can be used in switch statements:
  Selected HTML course

Вот сравнение этих подходов:

  1. Статические константные поля (Static Final Fields):

    • Просты в реализации.
    • Может содержать любые типы значений.
    • Не обеспечивают типовую безопасность (можно присвоить любую строковую величину).
    • Не могут быть использованы в операторах switch.
  2. Константы интерфейса (Interface Constants):

    • Похожи на статические константные поля.
    • Может привести к загрязнению пространства имен, если класс реализует несколько интерфейсов с константами.
    • Не имеют инкапсуляции или методов.
    • Также не обеспечивают типовую безопасность.
  3. Перечисления (Enums, современный подход):

    • Типобезопасны (можно присвоить только допустимые константы перечисления).
    • Может иметь методы и поля.
    • Может быть использовано в операторах switch.
    • Поддерживает итерацию по всем константам с использованием values().
    • Может реализовывать интерфейсы.
    • Более эффективно по памяти.

В большинстве современных Java - приложений перечисления являются предпочтительным способом определения констант из - за их типовой безопасности и дополнительных возможностей.

Резюме

В этом практическом занятии (lab) вы изучили несколько важных концепций, связанных с перечислениями (enums) в Java, а также узнали, как преобразовать их в строки:

  1. Создание базового перечисления: Вы создали простое перечисление для представления набора констант и поняли, как работают перечисления в Java.

  2. Преобразование перечисления в строку с помощью name(): Вы узнали, как метод name() возвращает точное имя константы перечисления, как оно определено в коде. Это полезно для точного сопоставления и программных операций.

  3. Пользовательское строковое представление с помощью toString(): Вы настроили строковое представление констант перечисления, переопределив метод toString(). Это полезно для создания удобочитаемых представлений.

  4. Альтернативные способы объявления констант: Вы исследовали различные способы объявления констант в Java и поняли, почему перечисления обычно являются предпочтительным подходом в современных Java - приложениях.

Перечисления в Java предоставляют мощный способ определения констант с учетом типовой безопасности и дополнительной функциональности. При работе с перечислениями в реальных приложениях способность преобразовывать их в строки является важной для пользовательских интерфейсов, сохранения данных и взаимодействия с другими системами.

Некоторые важные выводы:

  • Используйте name(), когда вам нужно точное имя константы.
  • Переопределяйте toString(), когда вам нужно пользовательское строковое представление.
  • Рассмотрите возможность использования методов - геттеров для более сложных свойств перечисления.
  • Предпочитайте перечисления статическим константам для обеспечения типовой безопасности и использования дополнительных возможностей.

Эти навыки будут полезны вам в различных сценариях программирования на Java, от создания веб - приложений до разработки Android - приложений.