所以我在完成的项目上有这部分代码:
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;
}
我只是搞砸了,我想知道是否有更好的方法使用?编写此部分?运算符或其他任何方式。
答案 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) ... ) )