2

如果我用switchingetByIntValue()怎么办?真的有必要使用 aSparseArray吗?

public enum Gender {
    Unknown(0),
    Male(1),
    Female(2);

    private static final SparseArray<Gender> lookupTable = new SparseArray<Gender>();
    static {
        for (final Gender gender : EnumSet.allOf(Gender.class)) {
            lookupTable.put(gender.intValue, gender);
        }
    }

    private final int intValue;

    public static Gender getByIntValue(int val) {
        return lookupTable.get(val);
    }

    private Gender(int intValue) {
        this.intValue = intValue;
    }

    public int getIntValue() {
        return intValue;
    }
}
4

3 回答 3

2

由于您的 int 值从 0 到 2,没有孔,您确实可以简单地使用数组。开关也可以,尽管它可能比数组查找稍慢。但是除非你调用该方法数十亿次,否则它不会产生任何明显的差异。使用您认为最清晰、最容易理解和维护的内容。

于 2013-01-25T09:54:53.807 回答
2

如果您发布了实际int值,那么您不需要在每个枚举成员上显式设置它们,也不需要switch. 只需使用

Gender.values()[intValue]
于 2013-01-25T09:53:42.313 回答
0

List.copyOf( EnumSet.allOf( Gender.class ) )

警告:正如JB Nizet 所提到的,除了最极端的情况外,这种优化练习似乎很愚蠢。对于实际工作,我可能会推荐Marko Topolnik 的答案中看到的解决方案。但是,为了好玩,我在这个球上挥动了球棒。

似乎目标是通过给定的数字 0、1、2 快速访问呈现静态不可修改的集合。

从 Java 10开始,我们在接口上有这些新实现的(“默认”</a>)方法ListList.of& List.copyOf。这些产生一个不可修改的集合。尽管支持的实现没有记录并且可能会发生变化,但我会假设它类似于具有相似性能的数组。EnumSet如果后备实现检测到存在并使用某种位向量,则性能甚至可能比传统数组更快。

List我通过传递一个EnumSetto 来填充List.copyOf( Collection )

所以这:

private static final SparseArray<Gender> lookupTable = new SparseArray<Gender>();
static {
    for (final Gender gender : EnumSet.allOf(Gender.class)) {
        lookupTable.put(gender.intValue, gender);
    }
}

…变成这样:

private static final List < Gender > lookupTable = List.copyOf( EnumSet.allOf( Gender.class ) );

整个课程,main用于演示。

package com.basilbourque.example;

import java.util.EnumSet;
import java.util.List;

public enum Gender {
    UNKNOWN( 0 ),
    MALE( 1 ),
    FEMALE( 2 );

    private static final List < Gender > lookupTable = List.copyOf( EnumSet.allOf( Gender.class ) );

    private final int intValue;

    public static Gender getByIntValue ( int val ) {
        return lookupTable.get( val );
    }

    public int getIntValue () {
        return intValue;
    }

    // Constructor
    private Gender ( int intValue ) {
        this.intValue = intValue;
    }

    public static void main ( String[] args ) {
        // Testing.
        System.out.println( Gender.UNKNOWN.intValue );
        System.out.println( Gender.getByIntValue( 0 ) );
        System.out.println( "----" );
        System.out.println( Gender.MALE.intValue );
        System.out.println( Gender.getByIntValue( 1 ) );
        System.out.println( "----" );
        System.out.println( Gender.FEMALE.intValue );
        System.out.println( Gender.getByIntValue( 2 ) );
    }

}

跑的时候。

0

未知


1

男性


2

女性


顺便说一句,作为生物默认,FEMALE应该先来MALE

于 2018-04-25T03:39:05.570 回答