2

switchで使用する場合はどうなりgetByIntValue()ますか?本当に必要SparseArrayですか?

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した場合は、各列挙型メンバーに明示的に設定する必要はなく、も必要ありませんswitch。使用するだけ

Gender.values()[intValue]
于 2013-01-25T09:53:42.313 に答える
2

int値は穴なしで0から2になるので、実際には単純に配列を使用できます。スイッチも問題ありませんが、配列のルックアップよりも少し遅くなる可能性があります。しかし、このメソッドを何十億回も呼び出さない限り、目立った違いはありません。最も明確で理解しやすく、維持しやすいものを使用してください。

于 2013-01-25T09:54:53.807 に答える
0

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

警告: JB Nizetが述べたように、この最適化の演習は、最も極端なシナリオを除いて、ばかげているように見えます。実際の作業では、おそらくMarkoTopolnikによる回答に見られる解決策をお勧めします。しかし、楽しみのために、私はこのボールでバットを振った。

目標は、指定された番号0、1、2による非常に高速なアクセスで静的な変更不可能なコレクションをレンダリングすることであるようです。

Java 10の時点で、インターフェースに次の新しい実装済み(「デフォルト」</a>)メソッドがありListます:List.ofList.copyOf。これらは変更不可能なコレクションを生成します。バッキングの実装は文書化されておらず、変更される可能性がありますが、同様のパフォーマンスを持つアレイに似たものであると想定します。EnumSetバッキング実装がの存在を検出し、ある種のビットベクトルを使用した場合、パフォーマンスは従来の配列よりもさらに高速になる可能性があります。

Listにを渡すことでにデータを入力EnumSetList.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 に答える