【发布时间】:2016-04-06 14:56:59
【问题描述】:
我正在尝试了解 Java 中的范围。在 Perl 中,我可以执行以下操作:
my $x = 1;
{
my $x = 2;
say $x; # prints 2
}
say $x; # prints 1
换句话说,由于我在作用域内使用my 声明了变量 $x,因此该作用域中的 $x 变量是该作用域的本地变量(即,与全局 $x 变量不同的变量)。现在,在 Java 中我正在尝试做类似的事情,但我得到了错误
变量 rawURL 已在方法 run() 中定义
代码如下:
// Global rawURL
URI rawURl;
try {
rawURL = new URI("http://www.google.com");
} catch (Exception e) {
// Handle later
}
// Some time later
for (Element link : links) {
// rawURL in this scope
URI rawURL;
try {
rawURL = new URI(link.attr("abs:href"));
} catch (Exception e) {
// Handle later
}
}
现在,问题是,我不想为我的所有变量名都发挥创意,确保每个变量名都不同。我只是使用 rawURL 来构建一个规范化的 URL,所以它本质上是一个临时变量。我可以这样做:
for (Element link : links) {
rawURL = new URL(..);
}
但这会改变我的全局变量的内容,我真的不希望这样。有什么方法可以为局部变量使用与全局变量相同的名称?
【问题讨论】:
-
java中没有全局变量的概念。您可能需要为
URI重用或定义自己的新变量。 -
如果你的方法太长以至于你的变量没有好名字,这强烈表明你的方法应该被拆分成更短的方法。每种方法都有自己的范围。顺便说一句,捕获异常也是非常糟糕的做法。
-
我的方法没那么长。获取一个 URL,对其进行规范化,使用 jsoup 获取页面,解析 DOM,从页面中获取链接(规范化它们)并添加到 Redis。这就是它的全部内容,总共大约 40 行。
-
是的,这就是你应该努力的方向。我也觉得你的问题是由你处理异常的方式引起的。您为什么不发布真实完整的代码,以便我们提出更好的替代方案。
-
^您在这里很讽刺,但是是的,您的代码应该像您所描述的那样:
Page page = getPageUsingJsoup(normalizeUrl(url)); for (Link link: getLinksFromPage(page)) { storeLinkInRedis(link); }。看,那是非常易读的代码,它不需要很多变量,它会按照你的描述做它应该做的事情。但我理解,对于 Perl 程序员来说,这么清晰可能看起来很可怕 :)