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

Dan*_*247 1 java variables loops for-loop

String playerlist;

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

sendMessage(playerlist);
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?我需要在for-loop中有一个变量,然后在循环外部访问它.

谢谢,对不起,如果这是一个非常愚蠢的问题.我只是想不出来.

anu*_*ava 7

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

String playerlist = "";
Run Code Online (Sandbox Code Playgroud)

但是因为你正在操作字符串,所以使用StringBuilder而不是String 会好得多.Reason是String是不可变的,你将在for循环中的每个迭代中创建一个新的String.但是StringBuilder是可变的,并且有各种重载append方法来支持您的操作.使用StringBuilder,您的代码将如下所示:

StringBuilder playerlist = new StringBuilder();

for (Player p : allplayers) {
    playerlist.append(p.getDisplayName()).append(", ");
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*cin 6

你很亲密 您需要将第一行更改为

String playerlist = "";
Run Code Online (Sandbox Code Playgroud)

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

playerlist += p.getDisplayName() + ", ";
Run Code Online (Sandbox Code Playgroud)

desugars(*)到

String temp = playerlist;
playerlist = temp + (p.getDisplayName() + ", ");
Run Code Online (Sandbox Code Playgroud)

初始化后playerlist,您可以将其内容读入临时变量,然后进行更新playerlist.

不过,有两个更高级别的建议.

  1. 如果你有一个可用的连接方法,就像一些库提供的那样(就像.NETPython平台一样),你可以使用一个更容易阅读的连接.
  2. 但是,如果您没有可用的连接方法(AFAIK,Java标准库不提供此类内容),则应使用符合@ anubhava建议的StringBuilder.您将在大量字符串上获得更好的性能,并且代码更容易理解,这是双赢的.

编辑:正如@edalorzo在评论中正确提到的那样,只有初始化局部变量才会出错,并且静态和实例字段都会自动初始化.具体地,数字类型(int,long,double等)被初始化为0,布尔值被初始化为false,和引用类型被初始化为null.

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


(*):我在上面展示的"desugaring"几乎是准确的:事实上,playerlist只评估一次,这不会影响这个特定程序的行为.