List.copyOf( EnumSet.allOf( Gender.class ) )
警告: JB Nizetが述べたように、この最適化の演習は、最も極端なシナリオを除いて、ばかげているように見えます。実際の作業では、おそらくMarkoTopolnikによる回答に見られる解決策をお勧めします。しかし、楽しみのために、私はこのボールでバットを振った。
目標は、指定された番号0、1、2による非常に高速なアクセスで静的な変更不可能なコレクションをレンダリングすることであるようです。
Java 10の時点で、インターフェースに次の新しい実装済み(「デフォルト」</a>)メソッドがありList
ます:List.of
&List.copyOf
。これらは変更不可能なコレクションを生成します。バッキングの実装は文書化されておらず、変更される可能性がありますが、同様のパフォーマンスを持つアレイに似たものであると想定します。EnumSet
バッキング実装がの存在を検出し、ある種のビットベクトルを使用した場合、パフォーマンスは従来の配列よりもさらに高速になる可能性があります。
List
にを渡すことでにデータを入力EnumSet
し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
。