我有两个不同的枚举,我希望能够输出是否给定 string是枚举集合的一部分。这是我的代码:
public class Check {
public enum Filter{SIZE, DATE, NAME};
public enum Action{COPY, DELETE, REMOVE};
public boolean isInEnum(String value, Enum e){
// check if string value is a part of a given enum
return false;
}
public void main(){
String filter = "SIZE";
String action = "DELETE";
// check the strings
isInEnum(filter, Filter);
isInEnum(action, Action);
}
}
eclipse说在最后两行“过滤器无法解析为变量”但是
除此之外,函数“isInnnum”中的Enum param似乎是错误的。
这里有什么问题可以帮助吗?
答案 0 :(得分:20)
最简单(通常最有效)的方法如下:
public <E extends Enum<E>> boolean isInEnum(String value, Class<E> enumClass) {
for (E e : enumClass.getEnumConstants()) {
if(e.name().equals(value)) { return true; }
}
return false;
}
然后拨打isInEnum(filter, Filter.class)
。
答案 1 :(得分:9)
如果您不介意使用Apache commons lang3库,可以使用以下代码:
EnumUtils.isValidEnum(Filter.class, filter)
根据docs:
此方法与Enum.valueOf(java.lang.Class,java.lang.String)的不同之处在于它不会为无效的枚举名称抛出异常。
答案 2 :(得分:5)
以下是Louis Wasserman的Java 8 /流版本的答案。 (您也可以将此方法直接放入Enum类中,并删除其中一个参数)
public boolean isInEnum(String value, Class<E> enumClass) {
return Arrays.stream(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value));
}
答案 3 :(得分:2)
我没有足够的观点来直接评论西蒙塔的答案,但是这里提到的第二种方法是直接在枚举类中进行的:
var query = new esri.tasks.Query();
var queryTask = new esri.tasks.QueryTask("https://services.arcgisonline.nl/arcgis/rest/services/Basisregistraties/BAG/MapServer/4");
thema_4_Verblijf = new FeatureLayer("https://services.arcgisonline.nl/arcgis/rest/services/Basisregistraties/BAG/MapServer/4");
map_Thema_4.addLayer(thema_4_Verblijf);
thema_4_Verblijf.on("click", thema_4_Verblijf_Click);
function thema_4_Verblijf_Click(evt){
query.returnGeometry = true;
query.outFields = ["*"];
query.geometry = evt.mapPoint;
executeQuery();
};
function executeQuery()
{
queryTask.execute(query,Selectie);
}
function Selectie(featureSet){
alert("function called");
}
答案 4 :(得分:0)
避免使用循环进行验证。
我建议使用valueOf
。此方法内置于枚举,可能会考虑进行编译时优化。
这类似于实现静态Map<String,EnumType>
来优化查找,这是您可以采取的另一个考虑因素。
缺点是您必须使用异常处理机制来捕获非枚举值。
实施例
public enum DataType {
//...
static public boolean has(String value) {
if (value== null) return false;
try {
// In this implementation - I want to ignore the case
// if you want otherwise ... remove .toUpperCase()
return valueOf(value.toUpperCase());
} catch (IllegalArgumentException x) {
// the uggly part ...
return false;
}
}
}
另请注意,使用上面的类型实现,您的代码在调用时看起来更干净。你的主要现在看起来像:
public void main(){
String filter = "SIZE";
String action = "DELETE";
// ...
if (Filter.has(filter) && Action.has(action)) {
// Appropriate action
}
}
然后另一个提到的选项是使用静态Map。您可以使用这种方法来基于其他属性缓存所有类型的索引。在下面的示例中,我允许每个枚举值具有别名的列表。在这种情况下,查找索引将不区分大小写,强制为大写。
public enum Command {
DELETE("del","rm","remove"),
COPY("cp"),
DIR("ls");
private static final Map<String,Command> ALIAS_MAP = new HashMap<String,Command>();
static {
for (Command type:Command.values()) {
ALIAS_MAP.put(type.getKey().toUpper(),type);
for (String alias:type.aliases) ALIAS_MAP.put(alias.toUpper(),type);
}
}
static public boolean has(String value) {
return ALIAS_MAP.containsKey(value.toUpper());
}
static public Command fromString(String value) {
if (value == null) throw new NullPointerException("alias null");
Command command = ALIAS_MAP.get(value);
if (command == null) throw new IllegalArgumentException("Not an alias: "+value);
return command;
}
private List<String> aliases;
private Command(String... aliases) {
this.aliases = Arrays.asList(aliases);
}
}
答案 5 :(得分:0)
也可以这样做:
public boolean isInEnum(String value, Enum e){
return Enums.getIfPresent(e.class, value).isPresent();
}
可以在here找到更多详细信息。