【问题标题】:Initializing a class retrieved by a function Java for android初始化由函数 Java for android 检索到的类
【发布时间】:2015-02-20 21:32:21
【问题描述】:

关于stackoverflow的第一个问题:

好的,我正在为 android 编写一个 java 游戏,但在初始化从函数/方法中检索到的某些类时遇到了麻烦。这是我的代码:

static int unUsedCharacters = 10;
static Character char1;
static Character char2;
static Character char3;
static Character char4;
static Character char5;
static Character char6;
static Character char7;
static Character char8;
static Character char9;
static Character char10;

Character getFreeCharacter() {
        if (char1 == new Character()) {
            return char1;
        } else if (char2 == new Character()) {
            return char2;
        // and so on... until 10
        } else {
            return char10;
        }
    }

    public void createCharacter(String x) {
        if (unUsedCharacters > 0) {
            unUsedCharacters -= 1;
            getFreeCharacter() = new Warrior(); 
            //the warrior class extends the character class
        } else {
            /* no more characters */
        }
    }

所以问题出在我尝试做的地方:

    getFreeCharacter() = new Warrior();

上面写着:

预期变量。

有什么建议吗? (这可能非常简单,但这对我来说是全新的)

感谢您阅读/回复

【问题讨论】:

  • 预期变量。就是这么说的
  • 你不能初始化一个方法。这就是为什么你在那里得到错误。另外,你正在做char1 == new Character(),它总是返回false。您正在创建一个新实例,而 char1 尚未引用该实例。因此,char == new Character() 将始终返回 false
  • 您确实有这样的问题,但不是在您确定的那一点。如果您解释一下代码应该做什么,也许会有所帮助?
  • 那么代码必须初始化方法给出的那些字符。也感谢大家这么快回答!
  • 让我更清楚。您的代码是如此损坏,以至于我无法从中推断出您打算做什么的任何细节。您在这里至少有两个基本误解,我无法根据我面前的信息制定完整的答案。话虽如此,也许我应该特别问一下 getFreeCharacter() 方法的意义是什么。

标签: java android class methods


【解决方案1】:

这种形式的表达...

 (char1 == new Character())

...将总是评估为false(或抛出异常)。 new 运算符永远不会产生 null 结果,也永远不会产生对以前存在的对象的引用,但这些替代方案在任何时候都涵盖了 char1 的所有可能值。你更有可能想要这样的东西:

if (char1 == null) {
    char1 = new Character();
    return char1;
}

但事实上,我永远不会将十个字符包含在十个自变量中。我可能会使用Characters 中的List,或者最坏的情况是一个数组。

解决了这个问题,你遇到了不同的问题。您返回的 Character 已经是分配给预期插槽的对象。您可以设置它的属性(在它的类允许您这样做的范围内),但您不能通过分配给它来用不同的对象替换它。实际上,您根本无法直接分配给方法结果,但即使您将其存储在变量中,将不同的对象分配给该变量也不会有您想要的效果。

(请注意,顺便说一下,我区分分配给方法返回值的成员,您可以这样做,和分配给值本身,您不能这样做。)

我认为你最好完全摆脱getFreeCharacter()。如果您的课程结构更好,那么您将不需要它。而不是像这样声明char1 ... char10

// Yuck, don't do this
Character char1;
Character char2;
// ...
Character char1;

...按照我之前的建议进行操作并使用List:

import java.util.ArrayList;
import java.util.List;

public MyGame {

    List<Character> characters = new ArrayList<>();

    // ...

}

那么,你的createCharacter() 方法可以有这种形式:

public void createCharacter(String x) {
    if (characters.size() < 10) {
        characters.add(new Warrior()); 
    } else {
        /* no more characters */
    }
}

在其他地方,您可以通过其get() 方法检索字符列表的元素,例如characters.get(0)List 实例负责处理大量细节,否则您必须编写自己的代码。

【讨论】:

  • 感谢列表提示!但是如果我使用这个列表,我遇到了一个新问题,如何从列表中再次删除那些初始化的字符?
  • 请参阅List Javadocs。特别是,您可以使用其remove() 方法之一。
  • 现在我遇到了删除某些列表项的问题,但是这更容易理解!谢谢!这不再是这个问题的一部分;-)。
  • 好的,修好了! :-D 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多