创建模式对象,如
Pattern pattern1 = Pattern.compile("s", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
在同一个参数Pattern.CASE_INSENSITIVE | Pattern.DOTALL
中传递多个标志背后的逻辑是什么?
这种声明有没有名称?
可以像这样传递任何类型的对象吗?
答案 0 :(得分:2)
不,对象不能像那样传递。
这种方式通常用于将可变数量的标志(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
}
答案 1 :(得分:1)
调用的第二个参数是通过按位或其他两个整数获得的int:Pattern.CASE_INSENSITIVE and Pattern.DOTALL
。
这是以位模式压缩更多标志的标准方法。
对象的等效非自然方法是在容器对象中打包多个对象。
答案 2 :(得分:1)
这是bit mask,您正在做的是bitwise-or。这允许您在同一个参数中组合多个不同的标志,而不需要繁琐冗长的布尔参数列表。
这是values of the constants in Pattern,你会发现它是2的所有权力。这意味着您可以按位进行组合 - 或者不会发生位冲突。举个例子,CASE_INSENSITIVE = 2
和DOTALL = 32
,二进制,按位或类似:
00100000
00000010
| --------
00100010
然后在compile()
方法中它可以执行反向(按位和)以确定是否设置了给定标志:
// Example code, not what compile() actually does
boolean caseInsensitive = flags & CASE_INSENSITIVE != 0;
由于二进制本质上是连接的布尔值列表,并且计算机在处理二进制文件方面非常有效,因此在位掩码中存储一系列布尔值是合乎逻辑的步骤。您没有在更高级别的语言中看到它们(例如,Python的命名参数通常会解决相同的问题),但它是包含在Java工具箱中的常见且非常有用的模式。