可以简化这个吗?
public void setDisabled(boolean disabled) {
if(disabled)
this._rflags |= 1 << B1;
else
this._rflags &= ~(1 << B1);
}
设置1位字节(B1 = 2)
-edit -
我错过的重要信息
private char _rflags;
public static final char B1 = 1 << 2;
我想将它保留为char并将单个或多个位作为不同类型访问,因为数据来自带有联合的C结构。我也将通过UDP发回这些数据。
答案 0 :(得分:0)
您可能会看到一些巧妙的方法来重构您的方法。我会提供一些不同的答案。它可能适用于您的案件,也可能不适用;我没有太多的背景。
一种方法是使用Factory返回类的实例。如果&#39;是&#39;传递到Factory,返回包含此方法的类:
public void setDisabled() {
_rflags &= ~(1 << B1);
}
如果&#39; false&#39;传入后,工厂返回的类将是执行其他计算的单行程序。注意缺乏一个论点;因为决定已经做出,所以不需要它。关于访问_rflags
的Squint;我没有&#39;知道课程的样子。也许_rflags
将传递给此方法。
在一个更美丽的世界中,包含setDisabled(boolean)
方法的整个类将由工厂返回。然后,任何检查残疾人旗帜的案件都可以由工厂抽出。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
正式简化:在签名中将 void 更改为 Object (从未使用过):
return disabled == true ? this._rflags |= 1 << B1 : this._rflags &= ~(1 << B1);
答案 3 :(得分: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等。)。