【发布时间】:2011-08-20 07:29:29
【问题描述】:
我想创建result 变量final,我如何构造这段代码以便编译干净?我知道我过去曾这样做过,但我不记得我是如何构建它以使其发挥作用的。
以下代码是straw man 示例,我要清理的代码要复杂得多,这只是提炼我要完成的工作的精髓。
private boolean someMethod()
{
final boolean result;
try
{
// do the logic here that might throw the following
// exceptions
}
catch (final IOException ioe)
{
result = false;
}
catch (final ClassNotFoundException cnfe)
{
result = false;
}
return result;
}
我不能将result = true 放在try 块中,因为它不会与两个抱怨最终变量可能已经分配的catch 块一起编译。
我不能将它放在 finally 块中,因为这会产生与 try 块中相同的投诉?
我希望能够将result = 设置一次且仅一次。
那么你在哪里设置result = true; 让它编译干净?
【问题讨论】:
-
为什么要创建一个局部变量
final? -
我尽可能多地制作
final,因为它使调试更加容易,记录了变量应该被分配一次且仅一次的意图,并且是一种优化在大多数情况下也会提示编译器。我没有听说过这方面的争论,我知道尽可能多地引用变量final极大地提高了代码库的质量。 -
@Jarrod Roberson:对我来说,在这种情况下,这种“优化”会降低代码质量(即可读性)。没有理由将
result声明为final,尤其是当它会使您的方法不必要地更加复杂时。除了这种情况,我完全同意你的看法。 :) -
这是这个问题的稻草人,这实际上不是我想要按照我的意愿工作的代码,它不会使它变得更复杂,它使它更具可读性,并且如果我的代码中需要设置它的其他地方尝试覆盖它,编译器将捕获错误。
-
如果我的代码中需要设置此项的其他地方尝试覆盖它,编译器会捕获错误?这是一个局部变量!