2

是否可以简化这一点?

    public void setDisabled(boolean disabled) {
    if(disabled)
        this._rflags |= 1 << B1;
    else
        this._rflags &= ~(1 << B1);
}

它设置一个字节的 1 位 (B1 = 2)

-编辑-

我错过的重要信息

private char _rflags;

public static final char B1 = 1 << 2;

我想将其保留为 char 并以不同类型访问单个或多个位,因为数据来自带有联合的 C 结构。我还将通过 UDP 发回这些数据。

4

4 回答 4

0

您可能会看到一些巧妙的方法来重组您的方法。我将提供一个稍微不同的答案。它可能适用于您的情况,也可能不适用于您的情况;我没有很多上下文。

一种方法是使用工厂返回一个类的实例。如果将“true”传递给工厂,则返回包含此方法的类:

public void setDisabled() {
        _rflags &= ~(1 << B1);
}

如果传入“false”,则工厂返回的类将是执行其他计算的单线。注意缺少论据;由于已经做出决定,因此不需要它。关于访问的斜视_rflags;我不知道这些课程是什么样子的。也许_rflags会被传递给这个方法。

在一个更美好的世界中,包含您的方法的整个类setDisabled(boolean)将由工厂返回。然后工厂可以抽象出任何检查禁用标志的情况。

于 2012-06-21T12:14:24.377 回答
0

在 Java 中没有真正简洁的方法可以使它更短。如果您要重复它,我会说坚持 DRY 原则并将其放在另一种方法中。

public void setDisabled(final boolean disabled) {
    toggleFlag(B1, disabled);
}

private void toggleFlag(final int bit, final boolean on) {
    if (on)
        this._rflags |= 1 << bit;
    else
        this._rflags &= ~(1 << bit);
}
于 2012-06-21T12:21:15.050 回答
0

形式简化:在您的签名中将void更改为Object (从未使用过):

 return disabled == true ? this._rflags |= 1 << B1 :  this._rflags &= ~(1 << B1);
于 2012-06-21T12:51:55.510 回答
0

主要问题是将布尔值转换为int。如果不使用 java 中的某种条件运算符/if-else,就无法表达这一点。

有很多方法可以以看似聪明的方式做到这一点,但恕我直言,最好坚持使用大多数人容易理解的变体(您已经拥有的 if-else 方法)。

你可以把它写得更紧凑一点,但它仍然是一团糟:

final static int B1 = 2;

public void setDisabled(final boolean disabled) {
     final int bitmask = disabled ? (1 << B1) : 0;
     _rflags = (_rflags & ~bitmask) | bitmask; 
}

顺便说一句,如果将属性命名为enabled,并且在打开选项时设置位蜂,大多数人可能会发现它更合乎逻辑(这就是 setEnabled() 在语义上适用于 java.awt.Component 等的方式) .

于 2012-06-21T12:54:34.173 回答