我想从其字符串值(或可能是任何其他值)查找枚举.我尝试了以下代码,但它不允许在初始化程序中使用静态代码.有一个简单的方法吗?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
Run Code Online (Sandbox Code Playgroud) 我的代码在这里检测是否mimeType
等于某种MIME类型,如果是,它将进行某种转换
public void convertToMp3(File src, File target,String mimeType){
if(mimeType.equals("audio/mpeg")){
...
}else if(mimeType.equals("audio/wav")){
mp3ToWav();
}else if(mimeType.equals("audio/ogg")){
...
}else if(...){
... //More if and else here
}
Run Code Online (Sandbox Code Playgroud)
我缩短了我的代码,因为它有很多其他if语句,什么设计模式适合删除许多if和else或if语句?
我创建了一个自定义视图(在此处找到),其中包含enum类型的declare-styleable属性.在xml中,我现在可以为自定义属性选择一个枚举条目.现在我想创建一个以编程方式设置此值的方法,但我无法访问枚举.
attr.xml
<declare-styleable name="IconView">
<attr name="icon" format="enum">
<enum name="enum_name_one" value="0"/>
....
<enum name="enum_name_n" value="666"/>
</attr>
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
layout.xml
<com.xyz.views.IconView
android:id="@+id/heart_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="enum_name_x"/>
Run Code Online (Sandbox Code Playgroud)
我需要的是:mCustomView.setIcon(R.id.enum_name_x);
但是我找不到枚举,或者我甚至不知道如何获得枚举或枚举的名称.
无论如何通过将枚举与给定的字符串进行比较来检查枚举是否存在?我似乎找不到任何这样的功能.我可以尝试使用该valueOf
方法并捕获异常,但我被教导说捕获运行时异常并不是一种好的做法.有人有什么想法吗?
我在使用Enums的Java中遇到了问题.我已阅读有关为Enums分配值参数的文档.但是,我的问题是多值的问题,是否可能?
这就是我想要实现的:我有一个语言枚举.每种语言都由其名称和一些较短的别名表示(并非总是如此,并且并不总是相同的别名数)
这是一个例子:
public enum Language{
English("english", "eng", "en", "en_GB", "en_US"),
German("german", "de", "ge"),
Croatian("croatian", "hr", "cro"),
Russian("russian")
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样定义一个枚举,并通过调用Language.valueOf()获得正确的枚举值吗?
Java
valueOf()
为每个Enum<T>
对象提供了一个方法,所以给出了enum
类似的方法
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Run Code Online (Sandbox Code Playgroud)
一个人可以像查找一样
Day day = Day.valueOf("Monday");
Run Code Online (Sandbox Code Playgroud)
如果传递给的字符串valueOf()
与现有Day
值不匹配(区分大小写),IllegalArgumentException
则抛出a.
要进行不区分大小写的匹配,可以在Day
枚举中编写自定义方法,例如
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何通用的方法,在不使用值或任何其他额外对象的缓存的情况下,只编写一次lookup()
上面的静态方法(即,不是每个enum
),假定该values()
方法Enum<E>
在编译时被隐式添加到类中?
这种"通用" lookup()
方法的签名与该方法类似Enum.valueOf()
,即:
public static <T extends Enum<T>> T lookup(Class<T> enumType, String name); …
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含100个值的枚举.为简单起见,请参考以下示例:
public enum code
{
CODE_1("string1"),
CODE_2("string2"),
CODE_3("string3"),
CODE_4("string4"),
...
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个公共方法与已知的格式字符串(如"字符串1","字符串2" ......)转换中选取适当的枚举值CODE_1,CODE_2 ......这通常是通过遍历所有的值来实现的,如果找到匹配项,返回该枚举值.(详情可在此问题中找到.)
但是,我关注的是对所有值进行reguraly循环.这可能是一个巨大的瓶颈吗?如果不是100个元素,那么有1000个?
作为我自己的练习,我尝试使用静态地图优化此查找,这可以确保给定任何字符串的O(1)查找时间.我喜欢这个额外的噱头,但我只想在我的代码中包含它,如果它确实是必要的.使用迭代方法和map方法有什么想法和发现?
public enum Code
{
...
//enum values
...
//The string-to-Code map
private static final Map<String,Code> CODE_MAP = populateMap();
private static Map<String,Code> populateMap()
{
Map<String,Code> map = new HashMap<String,Code>();
for(Code c : Code.values())
{
map.put(c.getCode(), c);
}
return map;
}
private String code;
private Code(String code)
{
this.code = code;
}
public String getCode()
{
return this.code;
}
public Code convertFromString(String code)
{ …
Run Code Online (Sandbox Code Playgroud) 在我的Java程序中有Enum类就像..
public enum DemoType{
DAILY, WEEKLY, MONTHLY;
}
Run Code Online (Sandbox Code Playgroud)
在我的jsp中,我从用户那里获取值,例如选择框,这个Jsp称为DemoJspBean
...
<form:select path="repeatWeektype">
<form:option value="DAILY" />
<form:option value="WEEKLY" />
<form:option value="MONTHLY" />
</form:select>
Run Code Online (Sandbox Code Playgroud)
我的HibernateVO类是..
public class DemoVO{
@Column(name = "REPEAT_TYPE")
@Enumerated(EnumType.STRING)
private RepeatType repeatType;
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用Hibernate Bean(setter和getter)将此值插入到DB中
DemoVO demo = new DemoVO();
demo.setRepeatType(demoJspBean.getRepeatWeektype());
Run Code Online (Sandbox Code Playgroud)
但它显示错误..
那么如何将我的String值转换为枚举类类型?
有没有办法在Scala中自动解析字符串中的case对象?使用一些内置/自动生成的Scala函数?
例如,我有这些案例对象:( 请注意,有一个密封的父类)
abstract sealed class FlagReason
case object Spam extends FlagReason
case object Illegal extends FlagReason
case object CopyrightViolation extends FlagReason
case object Other extends FlagReason
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一些自动生成的功能,如下所示:
FlagReason.fromString(value: String): FlagReason
哪里FlagReason("Spam")
会返回Spam
case对象.
如果有,那我就不需要自己编写 - 我已经完成了:
object FlagReason {
def fromString(value: String): FlagReason = value match {
case "Spam" => Spam
case "Illegal" => Illegal
case "CopyrightViolation" => CopyrightViolation
case "Other" => Other
}
}
Run Code Online (Sandbox Code Playgroud)
背景:我正在将我的case对象转换为我用作html表单中的单选按钮值的字符串.当我处理提交的表单时,我正在将选定的值转换回case对象.
相关信息:这实际上可以使用Java枚举,请参阅此StackOverflow问题:按字符串值查找枚举
((我不认为我在寻找Scala的Parser Combinators.我想我要使用它们我仍然需要自己定义解析规则,而不是内置"自动"字符串到case对象转换) )
可能重复:
Java - 将字符串转换为枚举
我有一个使用枚举的方法:
mymethod(AnotherClass.MyEnum.PassedEnum);
Run Code Online (Sandbox Code Playgroud)
我想在一个接收一个成为MyEnum的String的类中嵌套它:
public static void method(String toPass){
mymethod(AnotherClass.toPass.PassedEnum);
}
Run Code Online (Sandbox Code Playgroud)
传递的变量必须是一个String但是我需要将它转换为Enum以传递给AnotherClass?
TIA