相关疑难解决方法(0)

Enum类型中wrt到构造函数的静态块的执行顺序

这来自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映射中".

我认为静态块在构造函数运行之前执行.实际上是在类加载时执行的.

我在这里错过了什么?

java enums jls

12
推荐指数
1
解决办法
4532
查看次数

从字符串映射到整数 - 各种方法的性能

假设我需要从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代码进行基准测试非常困难,所以我希望得到一些有根据的猜测.我的推理上面是否正确(列表更适合小型,地图更适合大型)?阈值大小约为多少?有什么区别做各种ListHashMap实现做什么呢?

java performance big-o data-structures

8
推荐指数
1
解决办法
4509
查看次数

获取字符串并同时与多个枚举类型进行比较

我真的需要帮助.

如果我有我的单独类,我们称之为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()用于每一个值.

java enums

7
推荐指数
1
解决办法
803
查看次数

我可以在Rust中将字符串转换为枚举而不使用宏吗?

例如,如果我有以下代码:

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 在枚举上有一个字符串查找功能,用于此特定目的.

是不是可以在不编写自己的宏或从箱子中导入宏的情况下获得这个?

string macros enums parsing rust

7
推荐指数
3
解决办法
2347
查看次数

从用户输入设置枚举

选择 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)

java enums

6
推荐指数
1
解决办法
9653
查看次数

如何从Kotlin中的Int创建枚举?

我有这个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)

我得到错误:

整数文字不符合预期的字符串类型

kotlin

6
推荐指数
6
解决办法
3656
查看次数

我应该如何将这些数据存储在Java枚举中?

将这些数据存储在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)

但这不起作用.我正在考虑存储一个文本值的可能性,该值总结了用户在此网页上看到的选项.

java enums

5
推荐指数
1
解决办法
1万
查看次数

验证成功的String以在Java中枚举转换

我有一个在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)

java enums exception

5
推荐指数
0
解决办法
2564
查看次数

将配置属性转换为枚举值

我有一个包含这一行的配置文件:

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)

java enums spring

5
推荐指数
1
解决办法
1万
查看次数

获取Enum实例

我有一个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财产的枚举?

java enums

5
推荐指数
2
解决办法
900
查看次数

标签 统计

enums ×8

java ×8

big-o ×1

data-structures ×1

exception ×1

jls ×1

kotlin ×1

macros ×1

parsing ×1

performance ×1

rust ×1

spring ×1

string ×1