在Java中如何编写循环仲裁枚举的代码?

Pau*_*lor 0 java enums

如何编写循环仲裁枚举的代码?

所以在下面的代码中使用枚举作为提供创建Html选择循环的值,但是我看不到如何将枚举传递给方法,或者如何访问标准.values().ordinal()方法.所以目前我已经硬编码了一个特定的枚举RenameFileOptions但我想使用任何枚举,我可以解析枚举类,RenameFileOptions.class但仍然如何访问.name(),.values()以及.ordinal()

public ContainerTag addCombo(UserOption userOption, int selectedValue)
{
    return div(
                label(userOption.getLabel().getMsg())
                    .withTitle(userOption.getTooltip().getMsg()),
                select(
                    each(Arrays.asList(RenameFileOptions.values()),
                            next ->
                                iffElse(next.ordinal()==selectedValue,
                                        option(next.name()).attr(Html.SELECTED, Html.SELECTED).withValue(String.valueOf(next.ordinal())),
                                        option(next.name()).withValue(String.valueOf(next.ordinal()))
                                )
                    ))
                .withName(userOption.getOption())
            );
}
Run Code Online (Sandbox Code Playgroud)

更新 由于似乎没有办法以一种无问题的方式实现这一点,我在每个枚举中添加了一个getOptions()方法,这就是发送到我的addCombo方法的内容.这意味着我必须基本上重复代码,我不喜欢这样做,但这意味着addCombo()方法可以根据需要工作,并且通过不引入困难的语法使代码更容易理解.

public enum RenameFileOptions implements OptionList
{
    NO(TextLabel.RENAME_FILE_OPTION_NO),
    YES_IF_MATCHED_TO_RELEASE(TextLabel.RENAME_FILE_OPTION_YES_IF_RELEASE_MATCH),
    YES_IF_MATCHED_TO_RELEASE_OR_SONG(TextLabel.RENAME_FILE_OPTION_YES_IF_RELEASE_OR_SONG_MATCH),
    YES_IF_HAS_BASIC_METADATA(TextLabel.RENAME_FILE_OPTION_YES_IF_HAS_METADATA),
    YES_FOR_ALL_SONGS(TextLabel.RENAME_FILE_OPTION_YES),

    ;
    private TextLabel label;

    RenameFileOptions(TextLabel label)
    {
        this.label=label;
    }

    public String getName()
    {
        return label.getMsg();
    }

    public String toString()
    {
        return getName();
    }

    public static List<NameKey> getOptions()
    {
        List<NameKey> options = new ArrayList<NameKey>();
        for(RenameFileOptions next:RenameFileOptions.values())
        {
            options.add(new NameKey(next.ordinal(), next.getName()));
        }
        return options;
    }
}

public class NameKey
{
    private Integer id;
    private String name;

    public NameKey(Integer id, String name)
    {
        this.id =id;
        this.name=name;
    }
    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

Art*_*ski 5

你应该使用Class.getEnumConstants()方法.

因此,代码的中间部分应该是类似的

                each(Arrays.asList(enumClass.getEnumConstants()),
                        next ->
                            iffElse(next.ordinal()==selectedValue,
                                    option(next.name()).attr(Html.SELECTED, Html.SELECTED).withValue(String.valueOf(next.ordinal())),
                                    option(next.name()).withValue(String.valueOf(next.ordinal()))
                            )
                ))
Run Code Online (Sandbox Code Playgroud)

你应该传入Class<? extends Enum<?>> enumClass方法参数.