这来自Effective Java:
// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum
= new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
}
// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
Run Code Online (Sandbox Code Playgroud)
请注意,Operation常量将从创建常量后运行的静态块放入stringToEnum映射中.试图使每个常量从其自己的构造函数放入映射将导致编译错误.这是一件好事,因为如果它是合法的,它会导致NullPointerException.除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段.这种限制是必要的,因为在构造函数运行时尚未初始化这些静态字段.
我的问题是关于这条线:
"请注意,操作常量将从创建常量后运行的静态块放入stringToEnum映射中".
我认为静态块在构造函数运行之前执行.实际上是在类加载时执行的.
我在这里错过了什么?
假设我需要从String
一个整数进行映射.整数是唯一的,从0开始形成连续范围.即:
Hello -> 0
World -> 1
Foo -> 2
Bar -> 3
Spam -> 4
Eggs -> 5
etc.
Run Code Online (Sandbox Code Playgroud)
至少有两种直接的方法可以做到这一点.使用hashmap:
HashMap<String, Integer> map = ...
int integer = map.get(string); // Plus maybe null check to avoid NPE in unboxing.
Run Code Online (Sandbox Code Playgroud)
或者列表:
List<String> list = ...
int integer = list.indexOf(string); // Plus maybe check for -1.
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种方法,为什么?可以说相对性能取决于列表/地图的大小,因为List#indexOf()
是使用String#equals()
- > O(n)效率的线性搜索,而HashMap#get()
使用哈希来缩小搜索范围 - >当地图很大时肯定更有效,但可能更低当只有很少的元素时(计算哈希值必须有一些开销,对吧?).
由于正确地对Java代码进行基准测试非常困难,所以我希望得到一些有根据的猜测.我的推理上面是否正确(列表更适合小型,地图更适合大型)?阈值大小约为多少?有什么区别做各种List
与HashMap
实现做什么呢?
我真的需要帮助.
如果我有我的单独类,我们称之为FileType.java,它看起来像这样:
public enum FileType
{
JPG,GIF,PNG,BMP,OTHER
}
Run Code Online (Sandbox Code Playgroud)
然后我抓住一个字符串从用户,把它inputString,我怎么可以比较"inputString"到每一个枚举值,最最少的代码量?
编辑:这是我尝试过的:
System.out.print("Please enter your photo's file type. It must be: JPG, GIF, PNG, BMP, or OTHER");
typeInput = kb.nextLine();
boolean inputMatches = false;
while(inputMatches == false)
{
System.out.print("Invalid input. Please enter your photo's file type. It must be: JPG, GIF, PNG, BMP, or OTHER");
if(typeInput.equalsIgnoreCase(FileType.values()))
{
inputMatches = true;
}
}
Run Code Online (Sandbox Code Playgroud)
PS.我很清楚我可以将单个变量设置为与枚举值相同的字符串.我也知道我可以.valueOf()
用于每一个值.
例如,如果我有以下代码:
enum Foo {
Bar,
Baz,
Bat,
Quux
}
impl Foo {
from(input: &str) -> Foo {
Foo::input
}
}
Run Code Online (Sandbox Code Playgroud)
这显然会失败,因为input
它不是Foo的方法.我可以手动输入:
from(input: &str) -> Foo {
match(input) {
"Bar" => Foo::Bar,
// and so on...
}
}
Run Code Online (Sandbox Code Playgroud)
但我没有获得自动便利.
看起来Java 在枚举上有一个字符串查找功能,用于此特定目的.
是不是可以在不编写自己的宏或从箱子中导入宏的情况下获得这个?
选择 java 备份并尝试熟悉枚举类型。我正在尝试创建一个地址簿,用户可以在其中创建联系人。我已经创建了所有内容,但是我在设置联系人类型(家庭、朋友、业务等...)时遇到了麻烦,我已经在单独的 Java 类中设置了一个枚举类。
public class ContactType
{
public enum contactType
{
Family,
Church,
Friend,
BusninessColleague,
ServicePerson,
Customer,
Other
}
}
Run Code Online (Sandbox Code Playgroud)
我的 Contacts 类看起来像:
public class Contacts
{
private contactType contact;
private String name;
private String streetAddress;
private String city;
private String state;
private String zipCode;
private String phone;
private String email;
private String photo;
public Contacts ( )
{
contact = null;
name = "XXX XXX";
streetAddress = "XXX";
state = "XX";
zipCode = "00000";
phone = "XXX-XXXX"; …
Run Code Online (Sandbox Code Playgroud) 我有这个enum
:
enum class Types(val value: Int) {
FOO(1)
BAR(2)
FOO_BAR(3)
}
Run Code Online (Sandbox Code Playgroud)
如何enum
使用创建一个实例Int
?
我试图做这样的事情:
val type = Types.valueOf(1)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
整数文字不符合预期的字符串类型
将这些数据存储在Java枚举中的最佳方法是什么?
<select>
<option></option>
<option>Recommend eDelivery</option>
<option>Require eDelivery</option>
<option>Require eDelivery unless justification provided</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我是java的新手并尝试过类似的东西
public enum Paperless {
"None" = null,
"Recommend eDelivery" = "Recommend eDelivery",
"Require eDelivery" = "Require eDelivery",
"Require eDelivery unless justification provided" = "Require eDelivery w/out justification"
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我正在考虑存储一个文本值的可能性,该值总结了用户在此网页上看到的选项.
我有一个在Web服务实现中定义为枚举的帐户类型列表.但是,当消费者调用Web服务时,它会传递一个需要转换为枚举的String.
什么是验证给定String将成功转换为枚举的好方法?
我使用了以下方法,但这可能是滥用异常(根据Effective Java,第57项).
AccountType accountType = null;
try{
accountType = AccountType.valueOf(accountTypeString);
}catch(IllegalArgumentException e){
// report error
}
if (accountType != null){
// do stuff
}else{
// exit
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含这一行的配置文件:
login.mode=PASSWORD
Run Code Online (Sandbox Code Playgroud)
和一个枚举
public enum LoginMode {
PASSWORD, NOT_PASSWORD, OTHER }
Run Code Online (Sandbox Code Playgroud)
还有一个春豆
<bean id="environment" class="a.b.c.Environment" init-method="init">
<property name="loginMode" value="${login.mode}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
当然还有豆类
public class Environment {
private LoginMode loginMode;
public LoginMode getLoginMode() {
return loginMode;
}
public void setLoginMode(LoginMode loginMode) {
this.loginMode = loginMode;
}
}
Run Code Online (Sandbox Code Playgroud)
如何将配置文件的属性(即String)转换为LoginMode的相应枚举值?
编辑:我知道如何获取字符串输入的枚举值,但问题是另一个:如果我尝试这样:
public class Environment {
private LoginMode loginMode;
public LoginMode getLoginMode() {
return loginMode;
}
public void setLoginMode(String loginMode) {
this.loginMode = LoginMode.valueOf(loginMode);
}
}
Run Code Online (Sandbox Code Playgroud)
spring抱怨getter和setter没有相同的输入和输出类型.
Bean property 'loginMode' is not writable or has …
Run Code Online (Sandbox Code Playgroud) 我有一个Enum
:
public enum Type {
ADMIN(1),
HIRER(2),
EMPLOYEE(3);
private final int id;
Type(int id){
this.id = id;
}
public int getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得Type
通过id
财产的枚举?