Как правильно использовать Enums с несколькими значениями - PullRequest
0 голосов
/ 11 декабря 2018

плохо знаком с Java и пытаюсь понять, как правильно использовать Enums в этом сценарии;

Пользователь выбирает свою модель из выпадающего списка, например

comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
  ...
  Focus,
  Mondeo,
  Fiesta,
  ...
}));

IМне нужно найти способ получить carId для строки, выбранной пользователем в моем Enum:

public enum Ford{
 ...
 FOCUS("Focus", 26),
 MONDEO("Mondeo", 6),
 FIESTA("Fiesta", 13),
 ...
 ;

 private final String name;
 private final int carId;
}

Я думал об использовании некоторого цикла сравнения, который пытается сопоставить строку, собранную с Ford.имя, и, если оно совпадает, верните carId:

    public String getCarId() {
    String selectedItem = comboBox1.getSelectedItem().toString();
    for (Ford c : Ford.values()) {
        if (c.name().equals(selectedItem)) {
            return c.carId
        }
    }
    return false;
    }

Однако я не уверен, как поступить / исправить мою проблему.

У меня отключена логика или я нахожусь направильный путь вообще?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Отслеживать объект перечисления, а не его метку

Сохранять ссылку на объект перечисления , выбранный пользователем, а не ссылку на строку отображаемого имени объекта перечисления.

// Display combobox
// User picks an item.
// Your event-handling code reacts by remembering which *object* not *string* was select.
Ford fordSelectedByUser = … ;  // You pull reference from the data model backing your widget. 

Я не знаю, какой виджет со списком вы используете.Например, в фреймворке Vaadin комбобокс поддерживается моделью данных объектов.Возможно, вы используете Swing?Я больше не вспоминаю детали того, как работает Swing, но, взглянув на эту документацию , похоже, что вы можете создать задний выпадающий список с объектами и использовать пользовательский рендер.

JComboBox< Ford >, а неJComboBox< String >

Создайте JComboBox, который содержит Ford объектов , а не String объектов.Вы можете получить массив всех ваших значений перечисления, вызвав values().Этот метод является странным и не указан в JavaDoc Enum, хотя упоминается в Enum.valueOf метод doc - это «неявный» метод, но я недумаю, что мы заботимся о кровавых технических деталях.

Ford[] fords = Ford.values() ; // Get array of all the objects defined by this enum.
JComboBox< Ford > fordsComboBox = new JComboBox( fords );

Отслеживание выбранного Ford выбранного объекта, а не его отображаемого имени.

public void actionPerformed( ActionEvent e ) {
    JComboBox cb = ( JComboBox )e.getSource() ;
    Ford selectedFord = ( Ford )cb.getSelectedItem() ;  // Is casting still needed, or is Swing Generics-aware? Maybe: Ford selectedFord = ( JComboBox< Ford > )e.getSource().getSelectedItem() ;
    updateLabel( selectedFord.getDisplayName() ) ;
}

Ваш пользовательский рендерер вызывает enum Ford объект getDisplayName метод, который вы напишите.

package com.basilbourque.example;

public enum Ford {

    FOCUS( "Ford" , 26 ),
    MONDEO( "Mondeo" , 6 ),
    FIESTA( "Fiesta" , 13 );

    private final String displayName;
    private final int id;

    // Constructor
    Ford ( String name , int carId ) {
        this.displayName = name;
        this.id = carId;
    }

    // Getters
    public String getDisplayName ( ) {
        return this.displayName;
    }

    public int getId ( ) {
        return this.id;
    }

    // `Object` methods
    @Override
    public String toString ( ) {
        return "Ford{ " +
                "id=" + id +
                ", displayName='" + displayName + '\'' +
                " }";
    }

}

Советы:

  • Во всей вашей кодовой базе используйте Ford объекты, а не просто целое число его ID-номерани просто строка его отображаемого имени.Это делает ваш код более самодокументируемым, обеспечивает безопасность типов и обеспечивает допустимые значения.
  • Чтобы собрать подмножество Enum объектов, используйте EnumSet или EnumMap классы.Это высокопроизводительные реализации интерфейсов Set и Map с малым объемом памяти.
  • Помните, что Enum подходит, только если домен, набор всех возможных значений, известен при компиляции.время.Добавление или удаление любого из автомобилей означает редактирование класса Ford enum и повторную компиляцию.
    • Напротив, если ваше приложение может добавить больше Ford машин во время выполнения или исключить их, вы не можете использовать Enum.Вы бы сделали Ford обычным классом, а не подклассом Enum, и создали бы их экземпляры, как мы делаем любые POJO и собираем их .
0 голосов
/ 11 декабря 2018

Вы используете его уже достаточно правильно, только некоторые незначительные изменения

public enum Ford {
     FOCUS("Ford", 26),
     MONDEO("Mondeo", 6),
     FIESTA("Fiesta", 13);

     private final String name; //Good
     private final int carId; //Good


    /** This is a constructor for the enum variable */
    Ford(String name, int carId) {
        this.name = name; //stores the name variable for the enum
        this.carId = carId;
    }


    public int getCarId() { 
        return this.carId; //gets the carID from the enum variable
    }

    public String getCarName() { 
        return this.name; //gets the car name from the enum variable
    }
}

Для использования этого перечислимого класса и его значений здесь приведен пример

    public static void main(String[] args) {

        /** This is how you reference an enum value directly */
        System.out.println("Type: " + Ford.FOCUS 
                    + ", Name: " + Ford.FOCUS.getCarName() 
                    + ", ID: " + Ford.FOCUS.getCarId());


        /** This is how you can cycle through all of the values in this enum class */

        for (final Ford f : Ford.values())
            System.out.println("Type: " + f 
                    + ", Name: " + f.getCarName() 
                    + ", ID: " + f.getCarId());

    } 

Также обратите внимание, чтов Java ключевое слово «this» используется для ссылки на глобальную переменную, которая является членом класса / enum, в котором используется «this». Это означает «член этого класса»

0 голосов
/ 11 декабря 2018

Вам не нужно перебирать все значения, потому что вы можете легко получить значение перечисления в O (1) с помощью Enum.valueOf (String name) .

В вашемчехол Ford.valueOf(comboBox1.getSelectedItem().toString()).getCarId() должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...