gpt4 book ai didi

java - 如何正确使用具有多个值的枚举

转载 作者:行者123 更新时间:2023-11-30 06:02:46 25 4
gpt4 key购买 nike

Java 新手并试图了解如何在这种情况下正确使用枚举;

用户从组合框下拉列表中选择他的模型,例如

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

然后我需要找到一种方法来获取用户在我的枚举中选择的字符串的 carId:

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

private final String name;
private final int carId;
}

我正在考虑使用某种比较器循环,它会尝试将收集到的字符串与 Ford.name 进行匹配,如果匹配,则返回 carId:

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

但是我不确定如何继续/解决我的问题。

我的逻辑是完全错误还是我在正确的轨道上?

最佳答案

跟踪枚举对象,而不是它的标签

保留对 enum object 的引用由用户选择,而不是对枚举对象显示名称字符串的引用。

// 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框架,例如 combobox由对象的数据模型支持。也许您正在使用 Swing?我不再记得 Swing 如何工作的细节,而是扫了一眼 this documentation ,看起来您可以使用对象支持组合框并使用自定义渲染器。

JComboBox< Ford > , 不是 JComboBox< String >

制作 JComboBox拥有 Ford对象,而不是String对象。您可以通过调用 values() 获取所有枚举值的数组。 .那个方法很奇怪,没有列在 Enum 的 JavaDoc 中尽管在 Enum.valueOf 中提到方法文档 – 这是一个“隐式”方法,但我认为我们不关心那里的技术细节。

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() ) ;
}

您的自定义渲染器调用枚举 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 号的整数,也不仅仅是其显示名称的字符串。这使您的代码更加 self 记录,提供 type-safety ,并确保有效值。
  • 收集 Enum 的一个子集对象,使用 EnumSet EnumMap 类。这些是 Set 的高性能低内存实现。和 Map接口(interface)。
  • 记住一个Enum仅当域(所有可能值的集合)在编译时已知时才适用。添加或消除任何汽车意味着编辑您的 Ford枚举类并重新编译。
    • 相比之下,如果您的应用可以添加更多 Ford cars 在运行时,或消除任何,那么你不能使用 Enum .你会做 Ford常规类而不是 Enum 的子类,并会像我们做任何POJO一样实例化它们和 collect them .

关于java - 如何正确使用具有多个值的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53715052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com