关于这段Java代码的问题,为什么按原样编写

关于这段Java代码的问题,为什么按原样编写,java,set,bitwise-or,Java,Set,Bitwise Or,我偶然发现了这段源代码,并希望确保我理解为什么它是按原样编写的(或者它是否应该是这样编写的): boolean-modified=false; Set possibleSites=settings.getPossibleSites(); Set visibleSites=settings.getVisibleSites(); modified=someMysiousMethod(); //从不在可能站点中的可访问站点中删除站点 修改后的|=可见站点。保留(可能站点); 我对上一次发言的问题是:

我偶然发现了这段源代码,并希望确保我理解为什么它是按原样编写的(或者它是否应该是这样编写的):

boolean-modified=false;
Set possibleSites=settings.getPossibleSites();
Set visibleSites=settings.getVisibleSites();
modified=someMysiousMethod();
//从不在可能站点中的可访问站点中删除站点
修改后的|=可见站点。保留(可能站点);
我对上一次发言的问题是:

  • 为什么要使用按位运算符?retainAll()将返回一个布尔值,说明发生了什么

  • 接线员/声明是怎么说的?如果modified等于返回值,则保留modified的值,或者如果返回值不同,则将modified设置为该新值


  • 这意味着如果
    modified
    retainal()
    为真,则
    modified
    应为真。(这在给定名称时是有意义的。
    retainal
    仅在
    Set
    更改时返回true,而
    someMystiousMethod
    可能返回true或false,具体取决于
    Set
    的状态是否更改。)

    该守则分为:

    modified = modified | visibleSites.retainAll(possibleSites);
    
    查看以下代码以查看布尔运算的
    |
    结果:

    System.out.println(true|true);
    System.out.println(false|true);
    System.out.println(true|false);
    System.out.println(false|false);
    
    输出:

    true
    true
    true
    false
    
    (只有
    false | false
    将返回
    false
    ,因此在代码中,
    modified
    retainal
    都必须返回false才能将
    modified
    设置为
    false

    因此,上述语句意味着,如果
    modified
    true
    retainal
    返回true,则
    modified
    设置为true,否则,
    modified
    的值为false

    的返回值指示集合是否被调用更改

    返回:

    true
    如果此集合因调用而更改


    此处,
    true
    表示集合已修改。复合运算符对参数执行“或”,并将其赋值回左侧。在您的案例中,这意味着如果
    retainal
    返回
    true
    ,则将
    true
    分配回
    modified
    ,否则保持
    modified
    不变。

    根据javadoc

    retainal
    retuns
    true
    如果此集合因调用而更改

    a |=b
    是一种影响“
    a或b
    ”到
    a
    结果的操作。 因此,在您的情况下,我们的想法是影响
    modified
    语句的结果“
    visibleSites
    之前被修改,或者
    visibleSites
    在此之后被
    retainal

    修改:

    modified=someMysiousMethod()

    然后,修改的
    可能为真,也可能为假。以下因素的影响:

    修改后的|=可见站点。保留(可能站点)

    如果它已经为真,则将
    modified
    设置为真,如果其他条件成立,则将其从false更改为true(我有意说的是效果,我不是在描述实际的指令操作)

    第二项声明可以写成:

    if (visibleSites.retainAll(possibleSites)) {
          modified = true;
    }
    
    结果是一样的。在某种程度上,这是一个品味问题。我发现原始的(使用
    |=
    操作符)更容易阅读,因为它是一个简单的直线逻辑表达式,而不是一个控制流语句


    顺便说一下,它不是“按位”运算符。Java有两个“|”和两个相应的“|=”运算符;整数之间,布尔值之间。

    您看过的文档吗?
    boolean retainAll(Collection<?> c)
    
    modified |= visibleSites.retainAll(possibleSites);
    
    if (visibleSites.retainAll(possibleSites)) {
          modified = true;
    }