有一个9色的平方游戏。这些颜色中随机的一种颜色以9种颜色中的一种显示在屏幕上(例如:'橙色'绿色)。当用户点击与单词对应的彩色正方形时,用户会得分,忽略单词的颜色(例如,如果在任何颜色和橙色正方形中点击橙色,则会添加一个点进行评分) 。所有这些颜色字符串都存储在一个数组中(colorString [])。当分数达到10时,我在每个按钮的onClick方法中向colorString数组引入新值。值是每个颜色字符串的加密版本。问题是,即使为加密值轻敲正确的颜色框,分数也不会高于10.新的数组值不起作用。所有内容都在下面的代码中解释:
int score = 0;
Random colStr = new Random();
int decider = colStr.nextInt(9);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game3);
final Button loseStarter3;
loseStarter3 = (Button) findViewById(R.id.Starter3);
loseStarter3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
infoG3.setVisibility(View.GONE);
loseStarter3.setVisibility(View.GONE);
final TextView word = (TextView) findViewById(R.id.word);
word.setVisibility(View.VISIBLE);
greenButton.setVisibility(View.VISIBLE);
purpleButton.setVisibility(View.VISIBLE);
blueButton.setVisibility(View.VISIBLE);
blackButton.setVisibility(View.VISIBLE);
redButton.setVisibility(View.VISIBLE);
whiteButton.setVisibility(View.VISIBLE);
brownButton.setVisibility(View.VISIBLE);
orangeButton.setVisibility(View.VISIBLE);
yellowButton.setVisibility(View.VISIBLE);
final String[] colorString = new String[9];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
word.setText(colorString[decider]);
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
yellowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText() == colorString[0] || word.getText() == colorString[9] || word.getText() == colorString[10] || word.getText() == colorString[11]) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString = new String[9];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
word.setText(colorString[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27)+9;
final String[] colorString = new String[36];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
colorString[9] = "weyoll";
colorString[10] = "loyelw";
colorString[11] = "oelwyl";
colorString[12] = "erd";
colorString[13] = "der";
colorString[14] = "edr";
colorString[15] = "enrge";
colorString[16] = "regne";
colorString[17] = "nerge";
colorString[18] = "lcbka";
colorString[19] = "alkcb";
colorString[20] = "cbakl";
colorString[21] = "ihewt";
colorString[22] = "thewi";
colorString[23] = "ewthi";
colorString[24] = "relppu";
colorString[25] = "ulrpep";
colorString[26] = "leprpu";
colorString[27] = "ebul";
colorString[28] = "lbeu";
colorString[29] = "ulbe";
colorString[30] = "rbwno";
colorString[31] = "wobnr";
colorString[32] = "onwrb";
colorString[33] = "agonre";
colorString[34] = "negrao";
colorString[35] = "greaon";
word.setText(colorString[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
redButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText() == colorString[1]) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString = new String[9];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
word.setText(colorString[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27) + 9;
final String[] colorString = new String[36];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
colorString[9] = "weyoll";
colorString[10] = "loyelw";
colorString[11] = "oelwyl";
colorString[12] = "erd";
colorString[13] = "der";
colorString[14] = "edr";
colorString[15] = "enrge";
colorString[16] = "regne";
colorString[17] = "nerge";
colorString[18] = "lcbka";
colorString[19] = "alkcb";
colorString[20] = "cbakl";
colorString[21] = "ihewt";
colorString[22] = "thewi";
colorString[23] = "ewthi";
colorString[24] = "relppu";
colorString[25] = "ulrpep";
colorString[26] = "leprpu";
colorString[27] = "ebul";
colorString[28] = "lbeu";
colorString[29] = "ulbe";
colorString[30] = "rbwno";
colorString[31] = "wobnr";
colorString[32] = "onwrb";
colorString[33] = "agonre";
colorString[34] = "negrao";
colorString[35] = "greaon";
word.setText(colorString[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
greenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText() == colorString[2]) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString = new String[9];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
word.setText(colorString[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27) + 9;
final String[] colorString = new String[36];
colorString[0] = "yellow";
colorString[1] = "red";
colorString[2] = "green";
colorString[3] = "black";
colorString[4] = "white";
colorString[5] = "purple";
colorString[6] = "blue";
colorString[7] = "brown";
colorString[8] = "orange";
colorString[9] = "weyoll";
colorString[10] = "loyelw";
colorString[11] = "oelwyl";
colorString[12] = "erd";
colorString[13] = "der";
colorString[14] = "edr";
colorString[15] = "enrge";
colorString[16] = "regne";
colorString[17] = "nerge";
colorString[18] = "lcbka";
colorString[19] = "alkcb";
colorString[20] = "cbakl";
colorString[21] = "ihewt";
colorString[22] = "thewi";
colorString[23] = "ewthi";
colorString[24] = "relppu";
colorString[25] = "ulrpep";
colorString[26] = "leprpu";
colorString[27] = "ebul";
colorString[28] = "lbeu";
colorString[29] = "ulbe";
colorString[30] = "rbwno";
colorString[31] = "wobnr";
colorString[32] = "onwrb";
colorString[33] = "agonre";
colorString[34] = "negrao";
colorString[35] = "greaon";
word.setText(colorString[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
/*etc... for other buttons, same contents but different color name*/
我知道我只使用了||黄色的其他阵列价值,这只是一个例子。我也试过在colorString [0]下面使用单独的if语句,当==时将分数添加到其他值,否则如果。两者都没有奏效,他们只是破坏了应用程序。我也试过不同的按钮,不是那应该有所作为。我尝试改变if语句的顺序,只是再次失败。我花了一段时间试图解决这个问题,但遗憾的是无法解决这个问题。
如果有人可以为我提供修复,以确保接受这些其他数组值,我将不胜感激。如果有什么我还没有说清楚,那么所有内容都显示在我发布的代码中。非常感谢提前。
更新代码:
final String[] colorString1 = new String[9];
colorString1[0] = "yellow";
colorString1[1] = "red";
colorString1[2] = "green";
colorString1[3] = "black";
colorString1[4] = "white";
colorString1[5] = "purple";
colorString1[6] = "blue";
colorString1[7] = "brown";
colorString1[8] = "orange";
word.setText(colorString1[decider]);
final String[] colorString2 = new String[36];
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
yellowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText().equals(colorString1[0])) {
score++;
}
if (word.getText().equals(colorString2[9])) {
score++;
}
if (word.getText().equals(colorString2[10])) {
score++;
}
if (word.getText().equals(colorString2[11])) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString1 = new String[9];
colorString1[0] = "yellow";
colorString1[1] = "red";
colorString1[2] = "green";
colorString1[3] = "black";
colorString1[4] = "white";
colorString1[5] = "purple";
colorString1[6] = "blue";
colorString1[7] = "brown";
colorString1[8] = "orange";
word.setText(colorString1[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27)+9;
final String[] colorString2 = new String[36];
colorString2[0] = "yellow";
colorString2[1] = "red";
colorString2[2] = "green";
colorString2[3] = "black";
colorString2[4] = "white";
colorString2[5] = "purple";
colorString2[6] = "blue";
colorString2[7] = "brown";
colorString2[8] = "orange";
colorString2[9] = "weyoll";
colorString2[10] = "loyelw";
colorString2[11] = "oelwyl";
colorString2[12] = "erd";
colorString2[13] = "der";
colorString2[14] = "edr";
colorString2[15] = "enrge";
colorString2[16] = "regne";
colorString2[17] = "nerge";
colorString2[18] = "lcbka";
colorString2[19] = "alkcb";
colorString2[20] = "cbakl";
colorString2[21] = "ihewt";
colorString2[22] = "thewi";
colorString2[23] = "ewthi";
colorString2[24] = "relppu";
colorString2[25] = "ulrpep";
colorString2[26] = "leprpu";
colorString2[27] = "ebul";
colorString2[28] = "lbeu";
colorString2[29] = "ulbe";
colorString2[30] = "rbwno";
colorString2[31] = "wobnr";
colorString2[32] = "onwrb";
colorString2[33] = "agonre";
colorString2[34] = "negrao";
colorString2[35] = "greaon";
word.setText(colorString2[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
redButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText() == colorString1[1]) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString1 = new String[9];
colorString1[0] = "yellow";
colorString1[1] = "red";
colorString1[2] = "green";
colorString1[3] = "black";
colorString1[4] = "white";
colorString1[5] = "purple";
colorString1[6] = "blue";
colorString1[7] = "brown";
colorString1[8] = "orange";
word.setText(colorString1[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27)+9;
final String[] colorString2 = new String[36];
colorString2[0] = "yellow";
colorString2[1] = "red";
colorString2[2] = "green";
colorString2[3] = "black";
colorString2[4] = "white";
colorString2[5] = "purple";
colorString2[6] = "blue";
colorString2[7] = "brown";
colorString2[8] = "orange";
colorString2[9] = "weyoll";
colorString2[10] = "loyelw";
colorString2[11] = "oelwyl";
colorString2[12] = "erd";
colorString2[13] = "der";
colorString2[14] = "edr";
colorString2[15] = "enrge";
colorString2[16] = "regne";
colorString2[17] = "nerge";
colorString2[18] = "lcbka";
colorString2[19] = "alkcb";
colorString2[20] = "cbakl";
colorString2[21] = "ihewt";
colorString2[22] = "thewi";
colorString2[23] = "ewthi";
colorString2[24] = "relppu";
colorString2[25] = "ulrpep";
colorString2[26] = "leprpu";
colorString2[27] = "ebul";
colorString2[28] = "lbeu";
colorString2[29] = "ulbe";
colorString2[30] = "rbwno";
colorString2[31] = "wobnr";
colorString2[32] = "onwrb";
colorString2[33] = "agonre";
colorString2[34] = "negrao";
colorString2[35] = "greaon";
word.setText(colorString2[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
greenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText() == colorString1[2]) {
score++;
}
Random colStr = new Random();
if (score<=9) {
int decider = colStr.nextInt(9);
final String[] colorString1 = new String[9];
colorString1[0] = "yellow";
colorString1[1] = "red";
colorString1[2] = "green";
colorString1[3] = "black";
colorString1[4] = "white";
colorString1[5] = "purple";
colorString1[6] = "blue";
colorString1[7] = "brown";
colorString1[8] = "orange";
word.setText(colorString1[decider]);
}
if (score>9) {
int decider = colStr.nextInt(27)+9;
final String[] colorString2 = new String[36];
colorString2[0] = "yellow";
colorString2[1] = "red";
colorString2[2] = "green";
colorString2[3] = "black";
colorString2[4] = "white";
colorString2[5] = "purple";
colorString2[6] = "blue";
colorString2[7] = "brown";
colorString2[8] = "orange";
colorString2[9] = "weyoll";
colorString2[10] = "loyelw";
colorString2[11] = "oelwyl";
colorString2[12] = "erd";
colorString2[13] = "der";
colorString2[14] = "edr";
colorString2[15] = "enrge";
colorString2[16] = "regne";
colorString2[17] = "nerge";
colorString2[18] = "lcbka";
colorString2[19] = "alkcb";
colorString2[20] = "cbakl";
colorString2[21] = "ihewt";
colorString2[22] = "thewi";
colorString2[23] = "ewthi";
colorString2[24] = "relppu";
colorString2[25] = "ulrpep";
colorString2[26] = "leprpu";
colorString2[27] = "ebul";
colorString2[28] = "lbeu";
colorString2[29] = "ulbe";
colorString2[30] = "rbwno";
colorString2[31] = "wobnr";
colorString2[32] = "onwrb";
colorString2[33] = "agonre";
colorString2[34] = "negrao";
colorString2[35] = "greaon";
word.setText(colorString2[decider]);
}
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
/* same for other colored buttons */
答案 0 :(得分:1)
当你比较你的字符串你用“==”(这意味着你要比较2个对象的引用)时,你应该使用“equals”方法检查两个值是否等于。
答案 1 :(得分:0)
如果我删除您的代码并将final String[] colorString
声明更改为colorString1
,colorString2
,colorString3
,......它看起来像这样:
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
loseStarter3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
final String[] colorString1 = new String[9];
...
yellowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (word.getText().equals(colorString1[0]) ... ) {
score++;
}
Random colStr = new Random();
if (score<=9) {
final String[] colorString2 = new String[9];
...
}
if (score>9) {
final String[] colorString3 = new String[36];
...
}
因此,如果单击yellowButton - 根据Zarki进行检查 - 它将与word.getText().equals(colorString1[0])
一起检查,该colorString3
将永远不会在colorString
上检查36个条目。
有多种方法可以解决这个问题。
switchX
成为最外层类的成员变量,这可能是你的情况下的活动,它不需要是最终的,可以用字符串数组设置(快速解决方案)一般来说,一个好主意是将所有重复的数组初始化拉出到一个单独的类中,它可以有public class ColorField {
private String[] colorString = new String[36];
private int length = 9;
public ColorField() {
// init colorString
}
public void switchTo9() {
this.length = 9;
}
public void switchTo36() {
this.length = 36;
}
public int getLength() {
return this.length;
}
public String getField(int idx) {
// sanity checks omitted
return colorString[idx];
}
// more stuff
}
个方法来切换9到36个名称,如
colorString
更新:
好的,您的更新是另一种可能性。现在你可以删除内部decider
,因为你已经将它们放在外部闭包中了 - 这可能对bug没有帮助,但它会缩短代码并使其更具可读性。 注意colorString1也没用,你可以完全删除它,只使用colorString2 。
无论如何,我添加了一些关于代码中现在发生的事情的评论以及word
的一些更改 - 删除了内部声明 - 以及// declare "colorString2"
final String[] colorString2 = new String[36];
// initialize with values
colorString2[0] = "yellow";
colorString2[1] = "red";
colorString2[2] = "green";
colorString2[3] = "black";
colorString2[4] = "white";
colorString2[5] = "purple";
colorString2[6] = "blue";
colorString2[7] = "brown";
colorString2[8] = "orange";
colorString2[9] = "weyoll";
colorString2[10] = "loyelw";
colorString2[11] = "oelwyl";
colorString2[12] = "erd";
colorString2[13] = "der";
colorString2[14] = "edr";
colorString2[15] = "enrge";
colorString2[16] = "regne";
colorString2[17] = "nerge";
colorString2[18] = "lcbka";
colorString2[19] = "alkcb";
colorString2[20] = "cbakl";
colorString2[21] = "ihewt";
colorString2[22] = "thewi";
colorString2[23] = "ewthi";
colorString2[24] = "relppu";
colorString2[25] = "ulrpep";
colorString2[26] = "leprpu";
colorString2[27] = "ebul";
colorString2[28] = "lbeu";
colorString2[29] = "ulbe";
colorString2[30] = "rbwno";
colorString2[31] = "wobnr";
colorString2[32] = "onwrb";
colorString2[33] = "agonre";
colorString2[34] = "negrao";
colorString2[35] = "greaon";
// select first color string to be used for as word
word.setText(colorString2[decider]);
// select first visual color to be used for word
int[] androidColors =getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
// create click listener for yellow button
yellowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// on click, check if word color is matching
// this buttons color and increase score
if (word.getText().equals(colorString2[0])) {
score++;
}
if (word.getText().equals(colorString2[9])) {
score++;
}
if (word.getText().equals(colorString2[10])) {
score++;
}
if (word.getText().equals(colorString2[11])) {
score++;
}
// select new color string with difficulty level
// depending on score
Random colStr = new Random();
if (score<=9) {
decider = colStr.nextInt(9);
}
if (score>9) {
decider = colStr.nextInt(27)+9;
}
word.setText(colorString2[decider]);
// set new visual color
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];
word.setTextColor(randomAndroidColor);
}
});
/* same for other colored buttons */
设置。
// Declaration: declares variable colorString of type String[]
String[] colorString;
// Definition: define/set/assign the "content" of variable colorString
colorString = new String[36];
// Use: access the "content" of variable colorString
if (word.equals(colorString[6]) { }
深度解释:
一开始,既然我不知道你是哪个知识水平,我会通过引用清除一些单词 - 非常简短且仅在Java上下文中,这样你就可以找到更多的信息。需要的。
(Variable) Declaration: 变量声明引入了一个变量及其名称,类型和其他属性 - 不要与定义混淆和使用:
final String[] colorString = new String[36];
// now this should be an error
colorString = new String[9];
注意: final
表示变量只能定义一次 - 第一个定义称为初始化,依此类推:
// SCOPE0 - contains "Sample" and all classes/interfaces... available
class Sample {
// SCOPE1 - contains all from SCOPE0 and "Variable1" and "something"
private Integer Variable1 = 0;
function void something() {
// now here it gets special, a variable is only visible after
// declaration so java basically has a new local scope for each declaration
// SCOPE2 - contains all from SCOPE1 and some specials like `this`
Integer Variable2 = 1;
// SCOPE3 - contains all from SCOPE1 and "Variable2"
if(Variable1.equals(Variable2)) {
// SCOPE4 - contains all from SCOPE3
Integer Variable3 = 2;
// SCOPE5 - contains all from SCOPE4 and "Variable3"
// END OF SCOPE5 and SCOPE4
}
// now this will give an error because "Variable3" is not visible anymore
Variable2 = Variable3;
// END OF SCOPE3 and SCOPE2
}
}
Scope: 我无法用英语维基百科中的这句话来表达它的复杂性:
变量的范围描述了程序文本中可以使用变量的位置......
在上面的声明,定义和使用示例中,这一切都发生在同一范围内。范围可以嵌套,这意味着您可以从多个范围定义/使用变量,如:
SCOPE1
范围与静态绑定相关联。编译器可以静态地 - 意思是编译 - 收集知道哪个名称所需的所有信息,代码中的哪个位置意味着哪个变量,方法,类等。
范围的差异由语言或静态绑定机制定义。例如,在SCOPE3
中,在该类中声明的所有成员都是可见的。而在class Sample {
private Integer Variable1 = 0;
function void something() {
// Local variable gets the same name as the member "Variable1"
Integer Variable1 = 1;
// now we need to use "this.Variable1" to access the "outer"
// scopes "Variable1" because the name "Variable1" is bound to
// the local variable "Variable1"
if(Variable1.equals(this.Variable1)) {
// Local - meaning in the method body - Scope overrides are not allowed so this gives an error
Integer Variable1 = 2;
}
}
}
中,声明会创建一个新范围,而变量只在此范围内可见。
如您所见,变量通常仅在一个Scope中声明,但在相同和嵌套的Scopes中定义/使用。现在,当编程语言允许覆盖嵌套范围中的名称时,它会变得更有趣:
// Outer Scope of Activity: SCOPE_MAIN
...
@Override
protected void onCreate(Bundle savedInstanceState) {
// Local Scope of onCreate Method: SCOPE_OUTER_MLOCAL
...
loseStarter3.setOnClickListener(new View.OnClickListener() {
// Outer Closure
// anonymous class/closure with closures Scope: SCOPE_OUTER_CLOSURE
@Override
public void onClick(View v) {
// Local Scope of onClick Method: SCOPE_OUTER_CLOSURE_MLOCAL
...
final String[] colorString = new String[9];
...
yellowButton.setOnClickListener(new View.OnClickListener() {
// Inner Closure
// Scope: SCOPE_INNER_CLOSURE
@Override
public void onClick(View v) {
// Local Scope: SCOPE_INNER_CLOSURE_MLOCAL
// NOTICE that colorString is the USE of colorString DECLARED in SCOPE_OUTER_CLOSURE_MLOCAL
if (word.getText().equals(colorString[0]) ... ) {
score++;
}
Random colStr = new Random();
if (score<=9) {
// Scope introduced with declaration: SCOPE_INNER_CLOSURE_MLOCAL_SUB1
final String[] colorString = new String[9];
...
// This actually select the string from SCOPE_INNER_CLOSURE_MLOCAL_SUB1
word.setText(colorString[decider]);
// End of SCOPE_INNER_CLOSURE_MLOCAL_SUB1
// the here declared colorString does not exist anymore after this is executed
}
if (score>9) {
// Scope introduced with declaration: SCOPE_INNER_CLOSURE_MLOCAL_SUB2
final String[] colorString = new String[36];
...
word.setText(colorString[decider]);
}
Closure: 请注意..维基文章有点过于复杂&#34;前两个句子混合了范围,绑定,&#34;一等函数&#34;,变量捕获等等。
让我们减少它,并说闭包是程序的一部分,它有一个动态执行上下文 - 意味着带有变量的上下文以及在运行时创建的更多。
Java本地类 - 或匿名类 - 是java中闭包的一个示例。尽管如此,嵌套作用域的工作方式大致相同,当您考虑本地类定义的每次执行基本上是如何创建新类时,它会变得很丑陋。它绑定到相同的名称 - &#34;捕获的变量&#34;。
让我们查看您的原始代码并应用声明,范围和内容的知识,并为它们指定范围名称。
word.getText().equals(colorString[0])
也许现在我的写作更有意义。 onClick
点击侦听器的yellowButton
中的colorString
检查来自SCOPE_OUTER_CLOSURE_MLOCAL
范围内的score
,其中只有9个条目始终相同。
当word
达到9时,colorString
的字符串从SCOPE_INNER_CLOSURE_MLOCAL_SUB2
中的colorString
中选择,但该范围离开后该数组不再存在。
您可能尝试做的是从SCOPE_OUTER_CLOSURE_MLOCAL
替换final
但由于SCOPE_INNER_CLOSURE_MLOCAL_SUB1
因为SCOPE_INNER_CLOSURE_MLOCAL_SUB2
而不是那样,因为您刚刚在word
中声明了一个新变量{1}}或colorString
在SCOPE_OUTER_CLOSURE_MLOCAL
设置后停止存在。
仅使用1/2变量和colorString
初始化的更新代码没有这些问题因为它只使用==
中声明的变量所以它简单地消除了在第二个闭包内设置equals
的问题。
现在,为什么equals
偶尔使用 而不是==
,为什么要使用==
代替word.setText
?
这甚至更进一步,涉及string constant pool以及实际上正在飞行的字符串对象。 word.getText
是引用/地址比较,这意味着它检查左参数是否存储在与右参数相同的地址,这反过来意味着它检查两者是否是相同的对象。
它可能在你的情况下工作,因为隐式interning但它可以快速破解 - 并且非常难以调试 - 当某些东西创建并传回一个副本而不知道如f.e.一些第三方代码。例如,我不会信任equals
和==
来获取并返回相同的字符串对象。
经验法则是:如果比较内容,请使用equals
,如果比较基元/引用,则使用==
,实际上您知道哪些引用正在飞来飞去。由于{{1}}很简单,但{{1}}确实会产生麻烦,特别是如果您无法控制所有这些引用。
希望有所帮助。