?多个if /更清晰代码的操作符

时间:2018-11-07 01:52:13

标签: java

所以我在完成的项目上有这部分代码:

        if (mode == 1) {                    
        repeats = 2;
        columns = 6;
        size = 24;
    }
    else if (mode == 2) {               
        repeats = 2;
        columns = 8;
        size = 48;
    }
    else if (mode == 3) {               
        repeats = 3;
        columns = 6;
        size = 36;
    }

我只是搞砸了,我想知道是否有更好的方法使用?编写此部分?运算符或其他任何方式。

7 个答案:

答案 0 :(得分:4)

我将用每个int[][]的值定义一个mode作为 key 。喜欢,

int[][] modes = { {}, { 2, 6, 24 }, { 2, 8, 48 }, { 3, 6, 36 } };
if (mode > 0 && mode < 4) {
    repeats = modes[mode][0];
    columns = modes[mode][1];
    size = modes[mode][2];
}

答案 1 :(得分:1)

使用三元?运算符不起作用,因为根据mode的值,您有太多要更新的变量。如果用过?那么您一次只能在一个变量上使用它,那么代码将非常麻烦且难以阅读。切换是最好的选择

答案 2 :(得分:1)

擦除if的最佳方法是使用多态。对于给定的代码,您可以抽象一个类或接口并以不同的方式实现该方法。示例代码如下。

public class Test {
    public static void main(String[] args) {
        int modeValue = 1;//2,3 ...
        ModeFactory modeFactory = new ModeFactory();
        Mode mode = modeFactory.generateMode(modeValue);
        mode.fillData();
        System.out.println("mode info:" + mode.toString());
    }
}

abstract class Mode {
    int repeats;
    int columns;
    int size;

    abstract void fillData();

    @Override
    public String toString() {
        return "Mode{" +
                "repeats=" + repeats +
                ", columns=" + columns +
                ", size=" + size +
                '}';
    }
}

class Mode1 extends Mode {

    @Override
    void fillData() {
        repeats = 2;
        columns = 6;
        size = 24;
    }
}

class Mode2 extends Mode {

    @Override
    void fillData() {
        repeats = 2;
        columns = 8;
        size = 48;
    }
}

class Mode3 extends Mode {

    @Override
    void fillData() {
        repeats = 3;
        columns = 6;
        size = 36;
    }
}

class ModeFactory {
    Mode generateMode(int modeValue) {
        if (modeValue == 1) {
            return new Mode1();
        }
        if (modeValue == 2) {
            return new Mode2();
        }
        return new Mode3();
    }
}

design patterns可以帮助您解决这些问题。

答案 3 :(得分:0)

您不能在此处使用?运算符,因为它在每个分支中都返回一个值。在这种情况下,您可以使用开关:

switch (mode) {
            case 1: 
                repeats = 2;
                columns = 6;
                size = 24;
                break;

            case 2: 
               repeats = 2;
               columns = 8;
               size = 48;
                break;

            case 3:
            case SUNDAY: 
                ...
                break;

            default:
                System.out.println("No default value");
                break;
        }

答案 4 :(得分:0)

如果通过开关盒来阻止,则为多个的最佳选择。这将是更具可读性的代码。

int mode = 1;
  switch (mode) { 
        case 1:
            //your logic
            break; 
        case 2: 
             //your logic
            break; 
        case 3: 
            // your logic
            break; 
         default: 
            // When anything doesnt match 
            break; 
        } 

答案 5 :(得分:0)

我喜欢function fetch(x) { console.log('fetching resource ' + x); } var prom = Promise.resolve(); for(var i=1; i<=3; i++) { prom = (function(i){ return prom.then(() => { fetch(i);} );})(i); }语句。易于阅读和调试。但是我认为枚举更适合这种情况。即使仅在您的类中使用它,您也可以声明私有枚举,并且只能在单个方法内使用:

if

很好的是,您可以使用 private enum Mode{ ONE(2, 6, 24), TWO(2, 8 , 48), THREE(3, 6, 36); int repeats; int columns; int size; Mode(int repeats, int columns, int size){ this.repeats = repeats; this.columns = columns; this.size = size; } public int getRepeats() { return repeats; } public int getColumns() { return columns; } public int getSize() { return size; } } 并避免创建单独的数组。

Enum.values

答案 6 :(得分:-1)

Java具有switch statement,您可以使用它,如下所示:

switch(mode)
     case 1:
        repeats = 2;
        columns = 6;
        size = 24;
        break;
     case 2:
        repeats = 2;
        columns = 8;
        size = 48;
        break;
     case 3:
        repeats = 3;
        columns = 6;
        size = 36;
        break;
      ...

注意:请不要忘记在案例陈述中包括break。否则,该行为会进入下一个case语句,直到到达结尾或break

从技术上讲,您可以使用? operator,但是最好将它用于2种情况(条件为真或条件为假)。您还需要稍微更改逻辑。在这种情况下,这会使您的代码更糟。

if(mode == 1) ? repeats = 2; columns = 6; size = 24 : (if(mode == 2) ? repeats = 2, columns = 8; size = 48 : (if(mode == 3) ... ) )