2017-11-15 11 views
2

解決しようとしている問題:KotlinのC++列挙型同等物

私は要素のリストを持っています。リストは大きく、多くのものが存在する可能性があります。私はインデックスでそれらにアクセスしたいと思います。それらの索引については、数字の代わりに単語を使用したいと考えています。私はこの言葉が強く型付けされていることも望みたいので、数字を混ぜることはできません。

私は、すべての列挙がオブジェクトインスタンスそのものであるため、Kotlin列挙型はこれには適していないと信じています。私はInt定数を使うことができますが、型の安全性を失います。

この問題はEnumによって解決されます。列挙は、索引として使用するために、基本的な型(コンパイル時)にキャストすることができます。同じ型のEnumは型であり、関数がそれをパラメータとして受け取った場合、コンパイラは整数を渡すことを許可しません。列挙自体はオブジェクトではないため、パフォーマンスヒットなしに好きなだけ多くすることができます。

はこれにそれを削除し、あなたが二= 1の後ろにカンマを持って

string someArray[] = {"element 0", "element 1"}; 

enum class Index 
{ 
    first = 0, 
    second = 1, 
}; 

string getElement(Index i) 
{ 
    return someArray[(int)i]; 
} 

void foo() 
{ 
    auto element0 = getElement(Index::first); 
    auto element1 = getElement(1); // compile time error - parameter type mismatch 
} 
+0

"すべての列挙がオブジェクトインスタンスそのものなので、Kotlin列挙型はこれには適していないと私は信じています。 JVMの列挙型はシングルトンのインスタンスです。オブジェクトの作成が心配な場合は、列挙型の各値に対して1つのオブジェクトインスタンスを作成します。それとも私はあなたの意見を誤解しましたか? – zsmb13

+1

@ zsmb13インデックス定数としてenumを使用するので、シングルトンオブジェクトを作成する必要はありません。リストには何千もの要素が存在する可能性があるため、数千のインデックスが存在する可能性があります。非常に多くのオブジェクトを作成するには、不必要なオーバーヘッドのようです。 – rozina

答えて

-1

enum class Index 
{ 
    first = 0, 
    second = 1 
}; 
+1

これは私の質問に答えません。カンマには何も問題はありません。 – rozina

2

どう定義について

C++のコード例は、私が探しています何を表示します列挙型であり、また、enum要素で所望の型のリストを索引付けする拡張機能もありますか?この方法では、必要に応じてインデックス機能をFooのリストに限定することができます。それ以外の場合は、拡張機能を汎用化してください。

enum class Index { FIRST, SECOND } 
operator fun List<Foo>.get(index: Index) = get(index.ordinal) 

// Usage: 
val foo = listOfFoo[Index.FIRST] 

使用import com.example.Index.*だけFIRSTSECONDとしての要素にそれを参照します。

Or演算子と混乱しない非演算子関数を定義します。

fun List<Foo>.getElement(index: Index) = get(index.ordinal) 

// Usage: 
val foo = listOfFoo.getElement(Index.FIRST) 

しかし、私は両方を使用すると、その整数の偽名を持ってできるようにするソリューションは現在、ないと思います実行時にそれらのインスタンスを持つことは避けてください(コンパイル時のカスタムソース変換の可能性があります)。これに最も近いコンセプトはvalue typesですが、現在はJVMとKotlinのどちらでもサポートされていません。

+0

私は具体的には、定数のオブジェクトを作成しないソリューションを探しています。私はそのような解決策は不可能だと思う。 – rozina

0

何千ものオブジェクトは実際にはほとんどありませんが、通常のKotlin列挙型を使用して、Proguardを使用してそれらを最適化することができます。これはデフォルトでは行いますが、設定を慎重に行う必要があり、あとで徹底的にアプリケーションをテストすることを忘れないでください。