0

在创建模式对象时,例如

Pattern pattern1 = Pattern.compile("s", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

在同一个参数中传递多个标志背后的逻辑是什么Pattern.CASE_INSENSITIVE | Pattern.DOTALL

这种声明有什么名字吗?

任何类型的对象都可以这样传递吗?

4

3 回答 3

2

不,不能像那样传递对象。

这种方式通常用于将可变数量的标志(真/假)传递给方法。常量名称定义为 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
}
于 2012-08-07T19:28:52.273 回答
1

调用的第二个参数是一个 int,它是通过按位 OR-ing 其他两个 int 获得的:Pattern.CASE_INSENSITIVE and Pattern.DOTALL.

这是一种以位模式压缩更多标志的标准方法。

对象的等效非自然方法是将多个对象打包在一个容器对象中。

于 2012-08-07T19:24:15.137 回答
1

这是一个位掩码,您正在做的是按位或。这允许您在同一个参数中组合多个不同的标志,而不是需要冗长而冗长的布尔参数列表。

这是Pattern 中常量的值,您会注意到它们都是 2 的幂。这意味着您可以将它们与按位组合或不发生位冲突。以你的例子为例,CASE_INSENSITIVE = 2DOTALL = 32是二进制的,按位或类似的:

  00100000
  00000010
| --------
  00100010

然后在该compile()方法中,它可以执行逆操作(按位与)以确定是否设置了给定标志:

// Example code, not what compile() actually does
boolean caseInsensitive = flags & CASE_INSENSITIVE != 0;

由于二进制本质上是串联的布尔值列表,并且计算机在处理二进制时非常有效,因此将一系列布尔值存储在位掩码中是一个合乎逻辑的步骤。您在高级语言中看不到它们(例如,Python 的命名参数通常解决相同的问题),但它是一种常见且非常有用的模式,可以包含在您的 Java 工具箱中。

于 2012-08-07T19:38:06.507 回答