次のようなパターンオブジェクトを作成している間
Pattern pattern1 = Pattern.compile("s", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
同じパラメータ内で複数のフラグを渡す背後にあるロジックは何Pattern.CASE_INSENSITIVE | Pattern.DOTALL
ですか?
この種の宣言の名前はありますか?
どのタイプのオブジェクトもこのように渡すことができますか?
次のようなパターンオブジェクトを作成している間
Pattern pattern1 = Pattern.compile("s", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
同じパラメータ内で複数のフラグを渡す背後にあるロジックは何Pattern.CASE_INSENSITIVE | Pattern.DOTALL
ですか?
この種の宣言の名前はありますか?
どのタイプのオブジェクトもこのように渡すことができますか?
いいえ、そのようにオブジェクトを渡すことはできません。
この方法は通常、可変量のフラグ (true/false) をメソッドに渡すために使用されます。定数名は int または long として定義されます。
例えば:
public static final int FLAG_A = 1;
public static final int FLAG_B = 2;
public static final int FLAG_C = 4;
public static final int FLAG_D = 8;
int 定数の値は 2 の倍数なので、論理和で組み合わせることができます。
例えば:
int myValue = FLAG_A | FLAG_C;
myValue には FLAG_A と FLAG_C の情報が含まれるようになりました。FLAG_A が設定されているかどうかを確認するには、次を使用できます。
if ((myValue & FLAG_A) == FLAG_A) {
// flag a is set
}
呼び出しの2番目のパラメーターは、他の2つのintをビット単位でOR演算して得られるintですPattern.CASE_INSENSITIVE and Pattern.DOTALL
。
これは、ビットパターンでより多くのフラグを圧縮する標準的な方法です。
オブジェクトに対する同等の不自然なアプローチは、複数のオブジェクトをコンテナオブジェクトにパックすることです。
これはビット マスクであり、実行しているのはbitwise-orです。これにより、退屈で長く複雑なブール値パラメーターのリストを必要とするのではなく、同じ引数で複数の異なるフラグを組み合わせることができます。
以下は、Pattern の定数の値で、すべて 2 の累乗であることがわかります。これは、ビットごとに、またはビットが衝突することなくそれらを組み合わせることができることを意味します。あなたの例を取り上げるCASE_INSENSITIVE = 2
とDOTALL = 32
、バイナリ、ビット単位などで次のようになります。
00100000
00000010
| --------
00100010
次に、compile()
メソッドで逆 (ビットごとの AND) を実行して、特定のフラグが設定されているかどうかを判断できます。
// Example code, not what compile() actually does
boolean caseInsensitive = flags & CASE_INSENSITIVE != 0;
バイナリは基本的に連結されたブール値のリストであり、コンピューターはバイナリを非常に効率的に処理するため、一連のブール値をビットマスクに格納することは論理的なステップです。高水準言語ではあまり見られませんが (たとえば、Python の名前付きパラメーターは通常、同じ問題を解決します)、Java ツールボックスに含める一般的で非常に便利なパターンです。