//简单的枚举
public enum Planet {
MERCURY ,
VENUS
}
//复杂的枚举
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6)
private final double mass; // in kilograms
private final double radius; // in meters
//MERCURY (3.303e+23, 2.4397e6)里面的参数与构造函数对应
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double getmass() { return mass; }
public double getradius() { return radius; }
}
可以使用枚举的具体方法
Planet.MERCURY.getmass()
Planet.MERCURY.getradius()
<h:selectOneMenu id="CustomerStatusList" value="#{customerAccountsAction.status}">
<s:selectItems value="#{customerStatusList}" var="_s" label="#{_s.label}" noSelectionLabel="" />
<s:convertEnum />
</h:selectOneMenu>
@Factory
public CustomerAccountStatus[] getCustomerStatusList() {
return CustomerAccountStatus.values();//.values()是Enmu的公共方法,用于返回全部枚举值。
}
package org.manaty.model.party.customerAccount;
//枚举类定义
public enum CustomerAccountStatus {
ACTIVE("Actif"),LOCKED("Verrouill"),CLOSED("Ferm");
private String label;//对应于ACTIVE("Actif")括号里的Actif
CustomerAccountStatus(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
目前存在的问题是label="#{_s.label}"没法国际化,如果要在列表中国际化就应该 在getCustomerStatusList()
方法中修改枚举的label值,如此给CustomerAccountStatus增加setLabel方法,getCustomerStatusList()方法中循环 CustomerAccountStatus.values(),取出枚举值的name,然后再去资源文件中获取对应的国际化label。、
问题在于这样就修改了枚举值本身的内容,而枚举值的含义是相当于常量,常量是不可以改变的。
不用label来显示enmu,直接用enmu.name()来作为key去资源文件中取对应的国际化
<h:selectOneMenu id="CustomerStatusList" value="#{customerAccountsAction.status}">
<s:selectItems value="#{customerStatusList}" var="_s" label="#{messages[_s.name()]} " noSelectionLabel="" />
<s:convertEnum />
</h:selectOneMenu>
为什么使用_s.name()而不使用 _s.label呢?
因为label是特定enmu的方法,,而不是所有enmu有的方法,这样_s.label就不通用了。
补充:也可以作为一个约定来使用label,让每个enmu增加label方法,label相当于起了个别名,表达式的意思
更明白些,另外name表达的意思比较简短,容易重复。
System.out.println(Status.CLOSED);---CLOSED 输出枚举的名字
System.out.println(Status.CLOSED.name());--CLOSED 输出枚举的名字
System.out.println(Status.CLOSED.getLabel());--test.closed 输出枚举的label
public enum CycleType {
MONTH("Days of Month"),WEEK("Days of Week");
private String name;
CycleType(String name){
this.name=name;
}
public String toString() {
return this.name;
}
}
<a4j:outputPanel id="week"
rendered="#{calendarParam.cycleBasis == 'WEEK'}">
页面内的枚举比较使用的是【枚举名称】而不是toString()的名称