Java util模式实例

时间:2012-08-07 19:18:52

标签: java design-patterns

创建模式对象,如

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

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

这种声明有没有名称?

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

3 个答案:

答案 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 = 2DOTALL = 32,二进制,按位或类似:

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

然后在compile()方法中它可以执行反向(按位和)以确定是否设置了给定标志:

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

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