문제

어떻게 하는 것이 가장 좋은 지정하는 플래그에서 Java 방법은?

본 SWT 를 사용하여 int 로 비트 필드,다음과 같:

(예를 들어에서 부분적으로"효과적 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 값)다른 클래스에서 없이 함께 모든 컴파일러를 확인합니다.

에서 같은 책을("효과적 Java"),I 보의 사용 EnumSet 지만,다음의 사용자를 호출 된다:

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

이 조금 자세한 내가 선호하는 우아함의 SWT.

은 거기에 어떤 다른 대안 또는 이것이 기본적으로 두 개의 맛을 선택해야?

도움이 되었습니까?

해결책

당신이 벽을 때렸을 것 같아요.나는 다른 옵션이 보이지 않는다.Java는 사실입니다.이와 같은 상황에서 나는 보통 로컬 변수를 추가하여 코드를 더 읽기 쉽게 만드는 것입니다.당신은 이것을 할 수 있습니다,

EnumSet<Style> styles = EnumSet.of(Style.Bold, Style.ITALIC);
printText("hello", styles);
.

다른 팁

하려는 경우 스타일의 비트 플래그,Java 랩에서 그들을 BitSet.그것은 주변에 대한 연령대에,아직 몇 가지 사람들에게 그것을 사용하는(내장 선호하는 C 스타일의 비트를 처리에서 수).

Api 에 대한 BitSet 여기에서 찾을 수 있습니다.

과 함께 몇 가지 잘 선택한 정적 정수,그것은 꽤 잘 때까지 당신은 시작으로 점점 확인 및 설정의 여러 비트 중 하나에서 전달합니다.

나는 당신 EnumSet 접근 방법이다.

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

이 방법을 제공합형 안전,그리고 Style 는 enum 이가 본격적인 OO 기능입니다.

이 일을 가로 지르는 누구에게나 늦게 대답하십시오.다음은 메모리를 줄이고 API와 같은 멋진 열거를 가질 수있는 한 가지 방법입니다.

public static class MyFlag {

    public static final MyFlag A = new MyFlag(1<<0);
    public static final MyFlag B = new MyFlag(1<<1);
    public static final MyFlag C = new MyFlag(1<<2);
    public static final MyFlag ALL = A.and(B).and(C);

    private final int flag;

    private MyFlag(int flag){
        this.flag = flag;
    }

    public MyFlag and(MyFlag limit){
        return new MyFlag(flag & limit.flag);
    }

    public MyFlag not(MyFlag limit){
        return new MyFlag(flag | ~limit.flag);
    }

    public boolean isSet(MyFlag limit){
        if(limit ==null){
            return false;
        }
        return (this.flag & limit.flag) != 0;
    }
}
.

방법 :

public void doFoo(MyFlag flag){
   if(MyFlag.A.isSet(flag)){
   ....
   }
   if(MyFlag.C.isSet(flag)){
   ....
   }
}
.

통화 :

x.doFoo(MyFlag.A.and(MyFlag.C));
.

만 있는 경우의 수를 제한하는 방법 있을 것이트의 스타일(아 printText, 에서 예),조정할 수 있습니다 그들의 서명을 변수의 번호 스타일 params:

void printText(String text, Style... flags) {
  EnumSet<Style> style = logicalOr(flags); // see comment below
  ...
 }

그리고 당신의 통화에 매우 가까운 형식화되지 않은(int)플래그로

printText("hello", Style.BOLD, Style.ITALIC);

슬프게도,없 EnumSet.of(E... ) 공장 단지 EnumSet.of(E first, E... more), 하고,그래서 당신은 필요한 일반 logicalOr 는 방법을 배열 첫 번째+나머지어 있습니다. 왼쪽으로 독자에게 운동을=).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top