Java风格:开关中的变量声明
以下代码未编译,因为Java风格:开关中的变量声明,java,switch-statement,Java,Switch Statement,以下代码未编译,因为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
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”,可能导致混淆
- 添加大括号,使代码更加冗长
- 还有更好的主意吗
new Eater(Potato.class, many parameters)
.eat(more parameters);
这样做的缺点是调试起来有点困难。显然这不是你真正的代码,虽然。。。这使得说正确的事情很难。很可能正确的做法是将案例主体分解为不同的方法。为什么不这样做:
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引用,我会这样做。使用单独的变量如何降低代码的可维护性?(第一点)。如果我想说的话,它会起到相反的作用,因为变量名更好地解释了它是什么。如果将其保持在该范围内对您很重要,我会同意这一点。与您的方法的逻辑不完全相同(胡萝卜被视为默认值),但显示了另一种方法(还有一些我在这里不担心的幕后接线):
也许使用开关根本不是个好主意
我真的不想知道doSomethingElse()方法的作用。顺便说一句,我看到了
{
过了很长一段时间后换了一行……当别人用我的方式编码时感觉很好:-)CurtainDog:哈哈,我发誓这完全是随机的!Nivas:修正;-)提取方法是你的朋友。@mjfgates:不总是。按实际情况考虑。对于两行代码,我想我通常更愿意用额外的大括号。不过,在许多其他情况下,我同意每种情况越相似,就越容易复制粘贴以创建新的情况或重构每次创建之后,如果我必须为每种情况调整变量名,那将是一件痛苦的事情。如果没有充分的理由,我会避免创建许多变量名。此外,如果不使用大括号,则会占用更多的内存。
Eater eater = vegetable.getEater(many parameters);
if (eater != null) eater.eat(more parameters);
else doSomethingElse();
return true;