重写toString方法

时间:2012-07-25 22:17:48

标签: java tostring

我使用.toString来返回对象的字符串表示,即

jcb.engineMove(move.toString());

将产生e2e4。

我要做的是将此对象(e2e4)的文本提取为字符串。在谷歌搜索后,我遇到了覆盖toString方法,所以我提出了这个:

@Override
public String toString() {
    String s = "";
    int newRank = getRank();
    int newFile = getFile();
    final Move move = new Move(rank, file, newRank, newFile);
    s+="" + move;
    return s;
}

我的问题非常基础:

  1. 这是正确的方法
  2. 在尝试获取对象的文本时如何调用此例程?

7 个答案:

答案 0 :(得分:8)

覆盖Object.toString是一种很好的方法。

然而,您当前的实现通过创建新的Move对象(见下文)而犯了一个重大错误。

要调用例程(一旦修复它),请完成您正在执行的操作:

jcb.engineMove(move.toString());

如果toString()只应该用于调试(如mre所说),你可以实现另一个名为getText的方法,它可以做同样的事情。

重要提示:

不应在其Move方法中创建新的toString对象。

这是一个非常糟糕的主意(正如其他人所说)。

您的toString方法应该只是构建一个字符串并将其返回。

答案 1 :(得分:3)

toString()类中实现的Move吗?如果是,那么我看到的是无限循环。并且......我真的不明白为什么要创建Move类的新实例。

无论如何,要在Move类中生成字符串表示,请尝试使用以下内容:

public class Move {

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append(rank).append(file);
    builder.append(newRank).append(newFile);
    return builder.toString();
  }

}

然后,如果你想得到你正在做的字符串表示(jcb.engineMove(move.toString());)并不是一个糟糕的方法。

答案 2 :(得分:2)

Object#toString的使用应限于调试。

答案 3 :(得分:2)

我希望这不是toString()类中Move方法的代码。我担心的原因是你在其中创建Move对象并通过toString()递归调用s+="" + move;方法(这与s+=move.toString()相同)。

答案 4 :(得分:1)

  1. 覆盖toString()方法是实现对象的自定义文本表示的常用方法。您将在整个文献和文档中找到此程序。

  2. 在Java中(与C#等其他语言一样),toString()方法在对象类型中定义,这意味着Java中的每个对象都有此方法。如果您的自定义对象(继承自类object)覆盖toString()方法,则您的基类提供此方法的新实现,该方法隐藏/省略超类中的toString()方法。

  3. 这意味着当您在自定义类A中定义自定义toString()方法时,调用该类型的实例(比如说是a)a.toString()会导致调用您的实现。

答案 5 :(得分:1)

  1. 在这种情况下,我可能不会使用toString(),因为看起来你只是在重复Move类中的逻辑。为了添加任何其他细节,我有一个问题:你在哪个类中添加这个toString()方法?

  2. 您可以像调整其他任何方法一样调用此方法。首先,您需要一个对象实例来调用它:

    someObj.toString();

  3. 要提供更多详情,我需要回答上一个问题。

答案 6 :(得分:1)

如上所述,你不应该使用toString()来代替你的代码所依赖的功能。现在,你想要完成什么?你能提供这些课程的代码吗?我认为你的engineMove方法应该采用Move对象,而不是String。如果你能提供更多细节,我们可能会引导你朝着更好的方向前进。

另外,请注意您拥有的代码。为什么需要创建一个占用toString()内部时间和资源的新Move对象? toString()应该在类的实例上运行,所以你不需要创建一个新的,但更重要的是,使用     s + =“”+移动; 将隐式调用新Move对象上的toString(),它将在新的Move对象上再次调用它...