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;

データはユニオンを持つC構造体から取得されるため、charとして保持し、単一ビットまたは複数ビットに異なるタイプとしてアクセスしたかったのです。また、このデータをUDP経由で送り返します。

4

4 に答える 4

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 に答える
0

メソッドを再構築するための巧妙な方法がいくつか見つかるはずです。少し違う答えを出します。あなたのケースに当てはまる場合と当てはまらない場合があります。私は多くの文脈を持っていません。

1 つの方法は、Factory を使用してクラスのインスタンスを返すことです。「true」が Factory に渡されると、このメソッドを含むクラスが返されます。

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

正式な簡略化:署名のvoidObject (never used) に変更します。

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