切换到地图/枚举或其他

时间:2015-10-29 15:24:41

标签: java dictionary enums switch-statement

我想知道两件事:

  1. 是否值得从开关转换为
  2. 在我的情况下这会是什么样子?最大的问题是我的“案例ID_BOTH:”
  3. 我的蛋糕:

        public void init( int boxID ) {
    
        initComponentText();
    
        switch ( boxID ) {
    
            case ID_IMAGE:
                initComponentImg();
                break;
    
            case ID_BOOL:
                initComponentBool();
                break;
    
            case ID_BOTH:
                initComponentBool();
                initComponentImg();
                break;
        }
    }
    
    private void initComponentImg() {
        img = new ComponentImg( switchComponent );
    }
    
    private void initComponentBool() {
        bool = new ComponentBool( switchComponent );
    }
    
    private void initComponentText() {
        text = new ComponentText( switchComponent );
    }
    

    感谢您的帮助和提示。

3 个答案:

答案 0 :(得分:3)

我认为如果条件对降低代码复杂度更有帮助;

    if(ID_IMAGE==boxID||ID_BOTH==boxID)
        initComponentImg();
    if(ID_BOOL==boxID||ID_BOTH==boxID)
        initComponentBool();

答案 1 :(得分:1)

假设您让ID_BOTH成为ID_BOOLID_IMAGE的按位或,以及您的个人"类型"不具有重叠的二进制值(例如,2的幂),您可以按位-AND boxId来检查个性。使用此方法,您可以按位或按住所有类型。

int ID_NONE = 0
int ID_BOOL = 1;
int ID_IMAGE = 2;
int ID_TEXT = 4;

int ID_BOOL_IMG = ID_BOOL | ID_IMAGE; // 3
int ID_BOOL_TEXT = ID_BOOL | ID_TEXT; // 5
int ID_BOOL_ALL = ID_BOOL | ID_IMAGE | ID_TEXT; // 7

if ((boxId & ID_BOOL) == ID_BOOL) {
    initComponentBool(); // runs for boxId = 1, 3, 7
}
if ((boxId & ID_IMAGE) == ID_IMAGE) {
    initComponentImg(); // runs for boxId = 2, 3, 7
}
if ((boxId & ID_TEXT) == ID_TEXT) {
   initComponentText(); // runs for boxId = 4, 5, 7
}

答案 2 :(得分:0)

您可以使用bitwise AND运算符

public void init( int boxID ) {
  initComponentText();

  if ((boxID & ID_IMAGE) == ID_IMAGE) initComponentImg();
  if ((boxID & ID_BOOL) == ID_BOOL) initComponentBool();
}

假设

int ID_IMAGE = 1;
int ID_BOOL = 2;
int ID_BOTH = 3;

请参阅DEMO