【问题标题】:Java style: Variable declaration in a switchJava 风格:开关中的变量声明
【发布时间】:2010-09-17 06:12:38
【问题描述】:

以下代码无法编译,因为eater 定义了两次:

switch (vegetable) {
    case TOMATO:
        Eater eater = new Eater(Tomato.class, many parameters);
        eater.eat(more parameters);
        return true;

    case POTATO:
        Eater eater = new Eater(Potato.class, many parameters);
        eater.eat(more parameters);
        return true;

    case CARROT:
        doSomethingElse();
        return true;
}

我应该:

  • 使用单独的变量 `tomatoEater` 和 `potatoEater`,使代码更难维护?
  • 在 `switch` 之前定义 `eater`,让更多人可以访问它?
  • 仅在第一次定义 `eater`,会导致潜在的混淆?
  • 添加大括号,让代码更冗长?
  • 有更好的主意吗?

【问题讨论】:

  • 真的不想知道 doSomethingElse() 方法的作用。
  • 顺便说一句,我看到{ 在很长一段时间后换了一个新行...当其他人以与我相同的方式编码时感觉很好:-)
  • CurtainDog:哈哈,我发誓这完全是随机的!尼瓦斯:固定 ;-)

标签: java switch-statement


【解决方案1】:

我个人要么使用大括号,要么完全放弃局部变量:

new Eater(Potato.class, many parameters)
     .eat(more parameters);

这样做的缺点是调试起来有点困难。显然这不是你真正的代码......这使得很难说正确的事情。很有可能正确的做法是实际上将案例的主体分解为单独的方法。

【讨论】:

  • 提取方法是你的朋友。
  • @mjfgates:并非总是如此。随遇而安。对于双衬里,我想我经常宁愿带额外的牙套。但在许多其他情况下,我同意。
【解决方案2】:

为什么不这样:

switch (vegetable) 
{ 
    case TOMATO: 
        new Eater(Tomato.class, many parameters).eat(more parameters); 
        return true; 

    case POTATO: 
        new Eater(Potato.class, many parameters).eat(more parameters); 
        return true; 

    case CARROT: 
        doSomethingElse(); 
        return true; 
} 

如果您以后在其他任何地方都没有使用 Eater 参考,我会这样做。

【讨论】:

    【解决方案3】:

    与您的方法的逻辑不完全相同(胡萝卜被视为默认方法),但显示了另一种方法(这里有一些我不担心的幕后布线):

    Eater eater = vegetable.getEater(many parameters);
    if (eater != null) eater.eat(more parameters);
    else doSomethingElse();
    return true;
    

    【讨论】:

      【解决方案4】:

      使用单独的变量会如何降低代码的可维护性? (第一个要点)。如果有什么我会说它会做相反的变量名称更好地解释它是什么。如果将其保持在该范围内对您很重要,我会同意。

      【讨论】:

      • 每个案例越相似,最容易复制粘贴创建一个新案例,或者重构。假设我想在每次创建后添加一个eater.init(),如果我必须为每种情况调整变量名会很痛苦。如果没有充分的理由,我会避免创建许多变量名。而且,如果不与大括号一起使用,它会占用更多内存。
      【解决方案5】:

      也许使用开关根本不是一个好主意。


      In what better example can represent a switch statement in Java ?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 2018-02-03
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多