这被认为是代码重复吗?

时间:2013-08-08 13:33:58

标签: java switch-statement code-organization

如果我想使用case语句测试enum的多个值,并且80%的case语句需要两个不同的if检查,那么它是否被认为是不能重复使用该代码的编码过度?

我实际上使用了ctrl+cctrl+v,觉得代码上帝会杀了我。

以下是一些观点:

switch(value) {

   case value1:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value1
   }
   break;

   case value2:
   {
      //unique for value2
   }
   break;

   case value3:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value3
   }
   break;

   case value4:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value4
   }
   break;

   case value5:
   {
      //unique for value5
   }
   break;

   default:
   break;

我的value是从enum随机生成的,被称​​为随机数量。目标是value是任意随机的“价值”,完全独立于其他情况。

3 个答案:

答案 0 :(得分:4)

您可能希望将此重复代码放入方法中。

public void yourFunctionCall() {
    //Could even pass the value if needed
    if(something) { //do something; }

    if(somethingElse) { // do something else; }
}

然后在你的情况下调用这个方法:

switch(value) {

case value1: {
    yourFunctionCall();
    //or yourFunctionCall(value1);
    //unique for value1
} //etc..

答案 1 :(得分:2)

如果这是一段可重复使用的代码,那么最好将其转换为方法。如果没有,您只需使用fall-through添加另一个覆盖公共代码的switch case

switch (value) {

   case value1:

   case value3: // using fall-through

   case value4:
   {
      if (something) { /* do something; */ }

      if (somethingElse) { /* do something else; */ }
   }
}

switch (value) {

   case value1:
   {
      // unique for value1
      break;
   }

   case value2:
   {
      // unique for value2
      break;
   }

   // other unique cases
}

答案 2 :(得分:2)

使用函数可能更好,但这是另一种方式:

case value1:
case value3:
case value4:
  if(something) { /* do something */ }

  if(somethingElse) { /* do something else */ }

  if (value1)
  {
    //unique for value1
  }
  else if (value3)
  {
    //unique for value3
  }
  else // if (value4)
  {
    //unique for value4
  }
  break;

case value2:
  ...

或者使用嵌套开关:

case value1:
case value3:
case value4:
  if(something) { /* do something */ }

  if(somethingElse) { /* do something else */ }

  switch(value)
  {
    case value1: /* unique for value1 */ break;
    case value3: /* unique for value3 */ break;
    case value4: /* unique for value4 */ break;
  }
  break;

case value2:
  ...

谨慎使用,我不会真正推荐生产代码。