读取新的随机数组变量后得分不增加(Java) - Android Studio

时间:2016-10-31 19:46:21

标签: java android arrays android-studio random

有一个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 */

2 个答案:

答案 0 :(得分:1)

当你比较你的字符串你用“==”(这意味着你要比较2个对象的引用)时,你应该使用“equals”方法检查两个值是否等于。

答案 1 :(得分:0)

如果我删除您的代码并将final String[] colorString声明更改为colorString1colorString2colorString3,......它看起来像这样:

...
@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 local Classes (Closure)

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}}或colorStringSCOPE_OUTER_CLOSURE_MLOCAL设置后停止存在。

仅使用1/2变量和colorString初始化的更新代码没有这些问题因为它只使用== 中声明的变量所以它简单地消除了在第二个闭包内设置equals的问题。

现在,为什么equals偶尔使用 而不是==,为什么要使用==代替word.setText

这甚至更进一步,涉及string constant pool以及实际上正在飞行的字符串对象。 word.getText是引用/地址比较,这意味着它检查左参数是否存储在与右参数相同的地址,这反过来意味着它检查两者是否是相同的对象。

它可能在你的情况下工作,因为隐式interning但它可以快速破解 - 并且非常难以调试 - 当某些东西创建并传回一个副本而不知道如f.e.一些第三方代码。例如,我不会信任equals==来获取并返回相同的字符串对象。

经验法则是:如果比较内容,请使用equals,如果比较基元/引用,则使用==,实际上您知道哪些引用正在飞来飞去。由于{{1}}很简单,但{{1}}确实会产生麻烦,特别是如果您无法控制所有这些引用。

希望有所帮助。