9

Java メソッドでフラグを指定するためのベスト プラクティスは何ですか?

次のように、int をビットフィールドとして使用する SWT を見てきました。

(「Effective Java, 2nd Ed.」ページ 159 の一部の例):

public class Text {
  public static final int STYLE_BOLD = 1 << 0; // 1
  public static final int STYLE_ITALIC = 1 << 1; // 2

  void printText(String text, int flags) {

  }
}

クライアントの呼び出しは次のようになります。

printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);

..しかし、コンパイラ チェックなしで異なるクラスのフラグ (int 値) を混在させることができるため、これは推奨されません。

同じ本 (「Effective Java」) では、EnumSet の使用が見られますが、ユーザー呼び出しは次のようになります。

printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));

これは少し冗長だと思いますが、SWT のエレガンスさを好みます。

他に選択肢はありますか、それとも基本的にこれがあなたが選ばなければならない2つの味ですか?

4

5 に答える 5

7

壁にぶち当たったとします。他に選択肢はありません。Java は冗長ですが、それは事実です。このような状況では、通常、コードを読みやすくするためにローカル変数を追加します。あなたはこれを行うことができます、

EnumSet<Style> styles = EnumSet.of(Style.Bold, Style.ITALIC);
printText("hello", styles);
于 2011-05-20T14:30:38.727 に答える
2

私はあなたがアプローチで行くことをお勧めしますEnumSet

EnumSet<Style> styles = EnumSet.of(Style.Bold, Style.Italic);

このアプローチにより、型の安全性が向上しStyle、列挙型になると本格的なOO機能が得られます。

于 2011-05-20T15:22:00.590 に答える
2

ビットスタイルフラグが必要な場合、Javaはそれらを。でラップしますBitSet。それは何年も前から存在していますが、それを使用することを気にする人はほとんどいません(intにCスタイルのビット処理を埋め込むことを好む)。

BitSetのAPIはここにあります

いくつかの適切に選択された静的intと組み合わせると、1回のパスで複数のビットのチェックと設定を開始するまではかなりうまくいきます。

于 2011-05-20T14:40:07.387 に答える