繁体   English   中英

Java-for循环内外的访问变量

[英]Java - Access variable inside and outside of for-loop

String playerlist;

for(Player p : allplayers){
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

我该怎么做? 我需要在for循环内有一个变量,然后在循环外访问它。

谢谢,如果这是一个非常棘手的问题,对不起。 我只是想不通。

如果在循环外初始化变量,则可以得到:

String playerlist = "";

但是,由于您要处理字符串,因此使用StringBuilder代替String会更好。 原因是String是不可变的,您将在for循环的每次迭代中创建一个新的String。 但是,StringBuilder是可变的,并且具有各种重载的append方法来支持您的操作。 使用StringBuilder,您的代码将如下所示:

StringBuilder playerlist = new StringBuilder();

for (Player p : allplayers) {
    playerlist.append(p.getDisplayName()).append(", ");
}

你近了 您需要将第一行更改为

String playerlist = "";

在Java中,在初始化变量之前使用变量是非法的,并且该行

playerlist += p.getDisplayName() + ", ";

desugars(*)至

String temp = playerlist;
playerlist = temp + (p.getDisplayName() + ", ");

初始化playerlistplayerlist ,便可以将其内容读入临时变量中,然后更新playerlist

但是,有两个更高层次的建议。

  1. 如果有某些库提供的联接方法( .NETPython平台也是如此),则可以使用联接,它更易于阅读。
  2. 但是,如果没有可用的join方法(AFAIK,Java标准库不提供此类方法),则应使用StringBuilder ,与@anubhava的建议一致。 您将在大量字符串上获得更好的性能,并且代码更易于理解,这是双赢的。

编辑:正如@edalorzo在评论中正确提到的那样,您只会因未初始化局部变量而得到错误,并且静态字段和实例字段都会自动初始化。 具体来说,数字类型( intlongdouble等)初始化为0,布尔值初始化为false ,引用类型初始化为null

该规范明确描述了字段的自动初始化,因此您可以依靠它,但这很少是您想要的。 通常,以后使用该字段时,您将需要该字段的非默认值,因为null并不是非常有用(而且许多语言,尤其是像Standard ML这样的功能语言,都完全没有null )。 因此,我建议在构造函数中初始化对象的所有字段。


(*):上面显示的“减糖”几乎是准确的:实际上, playerlist仅被评估一次,这不会影响该特定程序的行为。

本地变量playerlist可能尚未初始化。 在java for loop语句中,局部变量必须首先初始化,然后在in循环块中使用。 您必须初始化playerlist 您可以使用以下代码:

String playerlist = null;

for(Player p : allplayers)
{
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

但是最好使用以下代码:

StringBuilder playerlist = new StringBuilder();

for(Player p : allplayers)
{
    playerlist.append(p.getDisplayName()).append(", ");
}
sendMessage(playerlist.toString());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM