問題タブ [enumset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - EnumSet をオンにします
古い方法では、複雑なビットマスクを使用したい場合は、次のswitch
ように簡単に実行できます (問題を示すためだけに頭のてっぺんからランダムに例を挙げました)。
最近ではenums
andを使っているのでEnumSets
、私は時々似たようなことをしたいと思います:
switch
、または値int
でしかできないため、これは機能しません。この時点で、その値は基本的に単なる隠し整数であるにもかかわらず、実行できないことに気付きました。しかし、私は掘り下げるのが好きで、機能は非常に便利に見えるので、次のようにします。enum
String
enum
まだ運がありません。文字列を切り替えるためのトリックと、EnumSets が実際には 64 ビット フィールド (またはそれらの配列) であることを知っているので、次のことも試してみます。
Human
hashCode()
が適切に実装されて一貫した結果が得られれば、機能する可能性があると考えています。いいえ:
java.lang.Error:未解決のコンパイルの問題: ケース式は定数式でなければなりません
さて、なぜこれを行う可能性がないのだろうか。私は常に、Java で古い学校のビットフィールドの適切な代替品のように考えてenums
いEnumSets
ましたが、ここでは、新しい方法ではより複雑なケースを処理できないようです。
適切なソリューションの種類は、可能性のいずれかと比較して最悪ですswitch
。
特に、 on が導入されて以来、switch
onStrings
には少なくとも 2 つの可能な実装があると思いswitch
ますEnumSets
。
- 式では、単純に列挙型自体の代わりに
case (Human.MAN | Human.DEAD)
コンパイル時の型チェックを使用します。ordinal()
- Strings と同じトリックを使用します。
- コンパイル時に、enum 値の を計算し
hashCode()
ますname
(そして、おそらく追加の何か - enum の値の数ordinal()
など - すべてはコンパイル時から静的で一定です)。はい、これはクラスまたはクラスのhashCode()
いずれかを変更することを意味します。EnumSet
Enum
- 列挙型自体の代わりに使用
- コンパイル時に、enum 値の を計算し
さて、これを簡単に実装することを不可能にする深刻な障害はありますか? それとも、これは実際に可能ですが、あまり頻繁に使用されないため、オラクルが実装するほど望ましくないというのは正しいでしょうか?
また、これは純粋に学術的な質問であり、適切な答えがない可能性があることを述べさせてください(わかりません。別の方法で質問することはありません)。答えられないことが判明した場合は、コミュニティ wiki にするかもしれません。しかし、私はどこにも答え(またはそれについて話し合っている人でさえ)を見つけることができなかったので、ここに行きます.
java - EnumSet または EnumMap がハッシュ化された対応物よりもパフォーマンスが高い可能性が高いのはなぜですか?
以下は、 EnumMap の Java doc の実装ノートセクションからのものです。
実装上の注意: すべての基本操作は一定時間内に実行されます。対応する HashMap よりも高速である可能性があります (保証はされていません)。
Java doc にEnumSet
も同様の行がありました。なぜその可能性が高く、ハッシュされた対応物よりも高速になるのEnumSets
か知りたいですか?EnumMaps
java - 一般的な Enum/EnumSet の問題
次のように定義されたクラスと関数があります。
両方の addAll 操作で、Eclipse から次のエラー メッセージが表示されます。
基本的に、何らかの形式のEnum
ジェネリックが必要ですが、制限のように見えるものに不満を感じています。互換性のない型がいくつEnum
かありますが、任意の型を保持できるコンテナーが必要です。
a
このコードでは、 、b
、およびcontents
がすべて同じ型であることを確認する方法がないことは認識していますがEnum
、実際の実装ではこれは問題になりません。
私の一般的なEnum
問題に対処するための考えや可能な方法は貴重であり、あなたの助けに非常に感謝しています. 前もって感謝します。
java - EnumSet のいずれかまたは両方をチェックする
そのため、代わりに EnumSet を使用するようにアプリケーションのいくつかのビットフィールドを変換しています。X|Y の比較を行うためのより良い方法があるかどうか知りたいです。現在、次のようなことを行っています。
EnumSet に相当するものは次のようです。
これを行うためのよりクリーンな方法はありますか?次のように確認できることを知っていますcontainsAll()
:
しかし、それは設定されているかどうかを知りたいシナリオのためのものです(X & Y)
。を確認する同等の方法はあり(X | Y)
ますか? メソッドのようなものがあると思いますがcontainsAny()
、その効果があると思われるものは何もありません。
java - 私の一般的な EnumSet メソッド - Enum.values() にアクセスできません
ビット マスクを含む整数から EnumSet 値を初期化する汎用メソッドを作成しようとしています。理解できないコンパイラ エラーが発生します。これが私のコードです:
コンパイラ エラー:
E の values() メソッドにアクセスするための特別な構文はありますか? (私は Java 初心者です。) 誰かがこのコンパイラ エラーを回避するのを手伝ってくれますか? ありがとう。
java - Java で一般的な enumset ウィジェットを作成する - 正しい構文を取得できない
私は、(任意の) 列挙セットを受け取り、単純なフォームをポップアップして、個々の列挙型のオンとオフを切り替えることができる汎用ウィジェットを作成しようとしています。以下は、クラスの最小バージョン (実際には Android で実行するように設定されています) ですが、Eclipse は「AbstractCollection 型のメソッド add(Capture#-7 of ?) は引数 (T) には適用できません」とうめき声を上げています。
数行前に、remove (まったく同じ署名を持つ) を問題なく呼び出しました。最初に列挙型をセットに変えようとしても役に立ちません。
これを修正するために必要な魔法の構文は何ですか?
私も最適なクラス定義を使用していない可能性があります ;) 私は Android Developer Tools v21.1.0-569685 を使用していますが、問題は適切な Eclipse でも表示されます (Indigo)
java - 文字列から EnumSet を逆シリアル化するエレガントな方法
そのメソッドEnumSet<FooType>
を使用していくつかをシリアライズしたいと思います。String
toString()
例:EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()
を与え[COMMON, MEDIUM]
ます。
問題は、そのような文字列をデシリアライズして に戻すエレガントな方法についてEnumSet<FooSet>
です。私はいくつかの一般的に知られているライブラリ (のようなものかもしれませんapache-commons
) またはそのようなもののための標準の Util クラスを探しています。
何かのようなもの:EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")
私はこのことを次のように実装しました:
しかし、すぐに使える解決策、またはこれを行うための劇的に簡単な方法があるかもしれません。
java - EnumSet 分割可能
私はwriteToParcel
メソッドを書いていますが、私のモデルにはEnumSet<object>
as 属性があります。out.write....()
このタイプにどれを使用する必要があるかわかりませんか?
java - インターフェイスを実装する列挙型の EnumSet の使用
私はインターフェースを持っています
列挙型
そして、私は次のようなことをしたいと思います:
そのエラーは(私の場合):
を使用すればSet<SomeInterface>
、この種のエラーを防ぐことができる (そして、正式な文法を表すクラスの開発を続行できる) ことがわかりましたEnumSet
が、HashSet
. どうすればこの問題を解決できますか?