如何编写循环仲裁枚举的代码?
所以在下面的代码中使用枚举作为提供创建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)
你应该使用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方法参数.